——在底部回答——
我的專案合作伙伴和我正試圖弄清楚如何訪問陣列中的物件,即我們 MongoDB 資料庫中的檔案中的物件。
我們正在建立一個網站,用戶可以在其中創建作業(在特定課程內),創建該作業后,可以導航到該課程的主頁,并訪問作業頁面(這將是一個通用的 .ejs 模板頁面,填充正確的資訊,基于我們創建的分配)。
例如,在 CS 212 課程中,我們創建了作業 1(填充了一些問題和答案)和作業 2。我們導航到 CS 212 的頁面,單擊作業 1,它應該會顯示這些問題和答案。
我們想使用我們在資料庫中創建的作業 ID 來訪問作業的資料庫資料,但是,“Courses.findOne( {assignments: assignmentID} )”(類似的東西)正在回傳整個課程 (CS 212)物件而不僅僅是賦值。
我們的架構如下:
const CourseSchema = new mongoose.Schema(
{
CourseNum: {
type: String,
required: true,
},
CourseName: {
type: String,
required: true,
},
CourseID: {
type: String,
required: true,
},
CourseCredits: {
type: Number,
required: true
},
CourseDescription: {
type: String,
required: true,
},
CourseMaterials: {
type: String,
required: true,
},
Instructors: {
type: [String],
required: true
},
Students: [String],
assignments: [assignmentSchema]
},
{ timestamps: true,
collection: 'courses' }
)
這是我們的主要模型,稱為課程,在作業內部(如您所見),我們將子檔案作為陣列中的另一個模式傳入:
const mongoose = require('mongoose');
// const assignmentSchema = require("/assignment");
const assignmentSchema = new mongoose.Schema(
{
assignmentId: {
type: String,
required: true,
unique: true
},
assignmentName: {
type: String,
required: true,
},
questions: {
type: [String],
},
answers: {
type: [String],
}
},
{
timestamps: true,
collection: 'assignments'
}
)
如您所見,我們正在嘗試根據課程儀表板頁面中 post 方法中傳入的值訪問特定的作業 ID,然后導航到我們的通用/動態填充的作業頁面,但特別是我們的 AssignmentID指定。
我們的代碼如下:
app.get("/assignXpage/:assign", requireAuth('instructor'), function (req, res){
let input = req.params.assign;
// let course = req.cookies.courseid;
console.log('input', input)
Course.findOne({"Course.assignments": { assignmentId: input}})
.then((result) => {
console.log(result)
res.render("pages/Instructor/assignmentXpage", { assign: result });
})
.catch((err) => {
console.log(err);
});
});
這段代碼如下:
let input = req.params.assign;
存盤我們正在尋找的特定作業的 ID,但 findOne(或 find)方法無法正常作業,并回傳整個 CS 212 課程。
任何幫助將不勝感激,謝謝!
-- 我們使用的答案 -- 我們使用的確切解決方案(基于以下用戶的回答)是:
Course.findOne({ "assignments.assignmentId": input })
.select({ assignments: { $elemMatch: { assignmentId: input } } })
.then((result) => {
res.render("pages/Student/assignmentXpagest", { assign: result });
})
.catch((err) => {
console.log(err);
});
uj5u.com熱心網友回復:
您可以在專案選項中將 $elematch用于上述回應。您的查詢將與此類似。
Course.findOne({'assignments.assignmentId': input}, {_id: 0, assignments: {$elemMatch: { assignmentId: '1'}}, CourseName: 1})
您必須在專案欄位的回應中添加所需的欄位,就像我添加了 CourseName 一樣。
您也可以使用$ 投影運算子執行此操作,其中投影物件欄位名稱中的 $ 表示該欄位的第一個匹配陣列元素的索引。
Course.findOne({'assignments.assignmentId': input}, {_id: 0, 'assignments.$': 1, CourseName: 1})
在上述兩個答案中,它只會回傳與查詢匹配的第一個元素。如果有多個物件與相同的賦值 id 相關,則必須使用聚合
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/390981.html
標籤:javascript 数组 MongoDB 猫鼬 嵌套
