数组模型上的Mongoose,Deep Population

时间:2015-06-02 11:38:25

标签: node.js mongodb mongoose mongoose-populate

我想深入填充一个可能过于复杂的模型

var ParentSchema = new Schema({
  childs: [{type:Schema.ObjectId, ref: 'Child'}],
});

var ChildSchema = new Schema({
    subject: [{
        price: {type: Number},
        data: {type: Schema.ObjectId, ref: 'Subject'}
    }]
})

然而,当我使用常规人口时,它似乎不起作用。我现在安装了deep-populate并使用以下内容:

Parent.deepPopulate('childs.subjects');

我想知道是否有更简单的方法可以完成一系列受试者。

2 个答案:

答案 0 :(得分:9)

mongoose-deep-populate插件适用于此,但您需要使用正确的路径来填充您想要填充的最深字段。在这种情况下,查询应如下所示:

Parent.findOne().deepPopulate('childs.subject.data').exec(function(err, parents) {...});

但是,重要的是要意识到这会使用多个查询(每个人口级别至少有一个)来执行填充。首先是Parent查询,然后是Child查询,然后是Subject查询。因此,最好尽可能嵌入相关数据,但如果您需要独立查询子项和主题数据,那么这是不切实际的。因此,如果您需要在不同的集合中使用相关文档,那么人口就是您的选择。

有关详情和指导,请参阅data modeling上的文档部分。

答案 1 :(得分:2)

如果您不想使用deepPopulate插件,可以在2遍中完成:

  1. 填充孩子
  2. 填充subject.data

    它将生成3个请求(一个用于Parent,一个用于Child,一个用于Subject),如deepPopulate插件所示:

  3. query = Parent.findOne().populate('childs');        
    query.exec(function(err, parent) {
        if (err) {
          //manage error
        };
        // now we need to populate all childs with their subject
        Child.populate(parent.childs, {
            path: 'subject.data',
            model: 'Subject'
        },function(err){
          // parent object is completely populated
        });
    });