猫鼬多个深层种群

Posted

技术标签:

【中文标题】猫鼬多个深层种群【英文标题】: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() 好的,谢谢。考虑发布您的有用评论作为答案,它可能对其他人有所帮助。 【参考方案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您的回答添加解释并说明适用的限制和假设。 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。

以上是关于猫鼬多个深层种群的主要内容,如果未能解决你的问题,请参考以下文章

如何使用猫鼬需要验证在猫鼬中插入多个文档?

猫鼬多个连接

验证多个猫鼬文档并更新

如何更新猫鼬中的多个文档?

如何更新猫鼬中的多个文档?

通过 id 集更新多个文档。猫鼬