首页 文章

使用另一个集合中的文档中的属性在一个集合中拉出文档(Mongo,MEAN Stack)

提问于
浏览
0

Context:

我正在开发一个测试网络应用程序,用户以考试形式回答问题 .

我目前有两个系列:

  • 测试

  • 问题

tests集合中的每个文档都有一个 questions 数组,其中包含问题集合中Mongo的文档ID .

My Question...

是否可以(一次性/一次性):使用提供的Mongo ID在测试中检索特定文档,然后使用保存在 questions 数组中的Mongo ID(在该文档中)然后从问题中提取文档?

我最接近的猜测是使用Mongoose的DBRef约定,但我不太明白如何在这种情况下使用它(即使我这样做,我也不明白如何检索多个问题并将它们保存在单个测试中) .

我很感激任何和所有的帮助!

P.S. 问题和测试是分开的原因是,当用户在网络应用程序中参加考试时,我们可以随机化问题的顺序 .

1 回答

  • 1

    走向另一个方向 . 将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文档,方法是在返回结果之前执行单独的查询 .

    populate() 只是序列化第二个 find() 的语法糖 .

相关问题