上下文:
我正在开发一款考试网络应用程序,用户可以在该应用程序中以考试形式回答问题。
我目前有两个收藏:
- 测试
- 问题
测试集合中的每个文档都有一个questions
数组,该数组包含问题集中文档的Mongo ID。
我的问题
是否可以(一次性/一次性):使用提供的Mongo ID在测试中检索特定文档,然后使用保存在questions
数组(该文档中)中的Mongo IDs从问题提取文档?
我最接近的猜测是使用Mongoose的DBRef约定,但我不太明白如何在这种情况下使用它(即使我理解了,我也不明白如何在一个测试中检索多个问题并保存它们)。
我将感谢所有人的帮助!
p.S. 问题和测试是分开的原因是,当用户在web应用程序中参加考试时,我们可以随机化问题的顺序。
转到另一个方向。将testId放在Question
模型上:
var TestSchema = new mongoose.Schema({
name: String
});
var Test = mongoose.model("Test", TestSchema);
var QuestionSchema = new mongoose.Schema({
testId: {
type: mongoose.Schema.ObjectId,
ref: "Test"
},
text: String,
answer: String
});
QuestionSchema.index({testId: 1})
var Question = mongoose.model("Question", QuestionSchema);
你有三种情况;内存中有一个question
文档,您想找到它所属的test
:
Test.findOne({_id: question.testId},callback);
或者您在内存中有一个question
文档,并且想要查找属于同一测试的所有questions
:
Question.find({testId: question.testId}, callback);
或者,您在内存中有一个test
文档,并希望找到它的所有questions
:
Question.find({testId: test._id}, callback);
我看到populate()
弹出作为任何类似你的问题的答案。我想确保人们意识到populate()
不是SQL JOIN
。来自文档:
填充的路径不再设置为其原始_id,在返回结果之前,通过执行单独的查询,将其值替换为从数据库返回的mongoose文档。
CCD_ 13只是用于序列化第二个CCD_。