【问题标题】:Mongoose, Deep Population on array modelMongoose,阵列模型上的深度种群
【发布时间】:2016-03-09 21:50:25
【问题描述】:

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

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

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

【问题讨论】:

  • deepPopulate 不填充主题数组中的数据键

标签: node.js mongodb mongoose mongoose-populate


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    如果您不想使用 deepPopulate 插件,您可以分两遍完成:

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

    【讨论】:

    • 感谢您的评论,它确实解决了我的问题,但我觉得其他解决方案更舒服。感谢您的宝贵时间
    猜你喜欢
    • 1970-01-01
    • 2017-06-02
    • 2018-10-12
    • 2019-05-13
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多