【问题标题】:Mongoose multiple deep populates猫鼬多个深层种群
【发布时间】:2018-02-10 13:49:54
【问题描述】:

说,我有Manager 架构:

{
    name: { type: String },
    clients: [{ type: Mongoose.Schema.ObjectId, ref: 'Client'}]
}

而且,我有 Client 架构:

{
    name  : { type String },
    cars  : [{ type: Mongoose.Schema.ObjectId, ref: 'Car' }],
    houses: [{ type: Mongoose.Schema.ObjectId, ref: 'House' }]
}

还有CarHouse(它们的结构对此并不重要。我如何在单个.populate() 调用中深度填充多个Client 的字段?

我尝试了什么:

Manager.find()
    .populate({
         path: 'users',
         populate: { path: 'cars' },
         populate: { path: 'houses' }
    });

如果它起作用,我真的会感到惊讶(因为我覆盖了之前声明的 populate 传递给 .populate() 方法的键)。我的示例显然返回每个用户填充的 houses 字段 - 最后一个。老实说,不知道,docs 也没有。它甚至支持吗?根据我的示例,我知道这是用于“浅”填充:

User.populate('cars')
    .populate('houses')

深的呢?

【问题讨论】:

  • 当然是Users.populate({ path: 'users', populate: { path: 'cars houses' } })。将'cars houses' 作为当前级别中以空格分隔的路径列表。至少对于单个级别来说是这样,所以对于其他任何事情来说肯定应该是一样的。
  • 谢谢,它有帮助。我是否忽略了文档中的解释?
  • 在文档开头的某处提到了空格分隔列表。它取代了你提到的.populate().populate()
  • 好的,谢谢。考虑发布您的有用评论作为答案,它可能对其他人有所帮助。

标签: node.js mongodb mongoose mongoose-populate


【解决方案1】:

1) 传递具有要填充属性的对象数组:

Manager.find()
    .populate({
         path    : 'users',
         populate: [
             { path: 'cars' },
             { path: 'houses' }
         ]
    });

此解决方案可以充分利用深度填充。考虑:

Manager.find()
    .populate({
         path    : 'users',
         populate: [
             { path: 'cars' },
             { 
                path    : 'houses',
                populate: {
                    path    : 'rooms',
                    populate: 'windows'
                }
             }
         ]
    });

2) 传递要填充的以空格分隔的集合字符串:

Manager.find()
    .populate({
         path    : 'users',
         populate: 'cars houses'
    });

【讨论】:

    【解决方案2】:

    这是做嵌套人口的方式。在这种情况下,首先它将填充用户,然后填充用户的爱好,然后从用户的爱好填充足球,然后它将从用户 -> 爱好 -> 足球 -> favouritePlayers 填充最喜欢的球员姓名。

    Model.find()
        .populate({
             path    : 'users',
             populate: [
                 { path: 'Hobbies' },
                 { 
                    path    : 'Football',
                    populate: {
                        path    : 'favouritePlayers',
                        populate: 'playerNames'
                    }
                 }
             ]
        });
    

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-07-31
    • 2019-09-13
    • 2017-06-02
    • 1970-01-01
    • 2014-02-08
    • 2013-11-27
    • 2016-12-17
    • 2018-09-13
    相关资源
    最近更新 更多