5

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

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');

我想知道是否有更简单的方法来完成一组填充的主题。

4

2 回答 2

11

mongoose -deep-populate插件可以解决这个问题,但您需要使用正确的路径到达您想要填充的最深字段。在这种情况下,查询应如下所示:

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

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

有关更多信息和指导,请参阅文档中有关数据建模的部分。

于 2015-06-09T12:51:38.803 回答
2

如果您不想使用 deepPopulate 插件,您可以通过 2 次完成:

  1. 填充孩子

  2. 填充 subject.data

    正如 deepPopulate 插件所做的那样,它将生成 3 个请求(一个用于 Parent,一个用于 Child,一个用于 Subject):

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
    });
});
于 2015-06-09T19:34:11.947 回答