填充是隐式的,它可以达到多少级别?

时间:2016-11-24 06:36:49

标签: mongodb mongoose mongoose-schema mongoose-populate

我的任务是使用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文档的查询始终返回完整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文档时,answer.reaction的每个元素只包含reaction的对象ID,而不是完整的reaction对象。我省略了什么或如何根据ref类型进行查询以执行连接?

mongodb版本是3.2.9,而mongoose是4.0.4。

1 个答案:

答案 0 :(得分:0)

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

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

以下是mongoose docs的链接:Mongoose Docs Deep Populate