populate 是隐含的吗?它可以深入多少层?

Is populate implicit and how many levels deep can it go?

我的任务是使用 mongoose.

修改现有的(大型)node.js 网站

该架构有一个 Question,它链接到 Answer 的数组,如下所示:

var QuestionSchema = mongoose.Schema({
   text: { type: String },
   ...
   answers: [{type: mongoose.Schema.Types.ObjectId, ref: 'Answer'}],
   ...
});

var AnswerSchema = mongoose.Schema({
   text: { type: String },
   ....
   question: {
      type: mongoose.Schema.ObjectId,
      ref: Question
   },
...
});     
var Question  = mongoose.model('Story', QuestionSchema);
var Answer = mongoose.model('Answer', AnswerSchema);

我找不到代码中使用的 populate 方法的任何实例,但是 Question 文档的查询总是 return 包含完整的 answer 对象,而不仅仅是对象 ID。这就是需要的。

我现在必须将 reaction 个对象的数组添加到 answer。我使用了以下内容:

var Answer = mongoose.model('Answer', AnswerSchema);
var ReactionSchema = mongoose.Schema({
    text: { type: String },
    .... 
    answer: {
        type: mongoose.Schema.ObjectId,
        ref: Answer,
       //required: true
    },
    ...
});

然后我将以下内容添加到 Answer 架构中:

reactions: [{type: mongoose.Schema.Types.ObjectId, ref: 'Reaction'}]
//where var Reaction  = mongoose.model('Reaction', ReactionSchema);

我能够保存 reaction 个对象,当我检查 answer 的数据库内容时,reaction 个对象在类型和形式上与 answer question.

中的对象

但是,当 question 文档被 return 编辑时,answer.reaction 的每个元素仅包含 reaction 的对象 ID,而不是完整的 reaction 目的。我遗漏了什么或如何进行查询以根据 ref 类型执行连接?

mongodb版本是3.2.9,mongoose是4.0.4。

如何查询问题?这是解决嵌套引用的方法:

Question.findById(id).populate({
  path: 'answer',
  model: 'Answer',
  populate: {
    path: 'reaction',
    model: 'Reaction'
  }
}).exec(function(err, data){});

这是 mongoose 文档的 link:Mongoose Docs Deep Populate