Node.js 基于阵列模型的猫鼬深层种群

Node.js 基于阵列模型的猫鼬深层种群,node.js,mongodb,mongoose,mongoose-populate,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'} }] }) 然而

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

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');
我想知道是否有一种更简单的方法来完成填充的主题数组。

插件可以实现这一点,但您需要使用正确的路径来填充最深的字段。在这种情况下,查询应如下所示:

Parent.findOne().deepPopulate('childs.subject.data').exec(function(err, parents) {...});
但是,重要的是要认识到这使用多个查询(每个填充级别至少一个)来执行填充。首先是父查询,然后是子查询,然后是主题查询。因此,最好在可能的情况下嵌入相关数据,但如果需要独立查询子数据和主题数据,则这是不实际的。因此,如果您需要在单独的集合中收集相关文档,则填充是一种方法


有关更多信息和指导,请参阅上的文档部分。

如果您不想使用deepPopulate插件,您可以通过两个步骤完成:

  • 填充子对象

  • 填充subject.data

    它将生成3个请求(一个用于父级,一个用于子级,一个用于主题),正如deepPopulate插件所做的那样:

  • query=Parent.findOne().populate('childs');
    query.exec(函数(err,parent){
    如果(错误){
    //管理错误
    };
    //现在我们需要用他们的主题填充所有孩子
    Child.populate(parent.childs{
    路径:“subject.data”,
    模型:“主题”
    },函数(err){
    //父对象已完全填充
    });
    });
    
    deepPopulate不会在主题数组中填充数据键谢谢你的评论,它确实解决了我的问题,但是我觉得使用其他解决方案更舒服。谢谢你抽出时间