Mongoose多重嵌套populate

10

比方说,我有一个Manager模式:

{
    name: { type: String },
    clients: [{ type: Mongoose.Schema.ObjectId, ref: '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 字段 - 最后出现的字段。老实说,我不知道,文档 中也没有相关内容。它是否被支持?根据我的示例,我知道它对于“浅层”填充是支持的:

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

深入的那个呢?


2
当然,这只是 Users.populate({ path: 'users', populate: { path: 'cars houses' } })。其中 'cars houses' 是当前级别中路径的以空格分隔的列表。至少对于单个级别是正确的,因此对于其他任何内容肯定也是相同的。 - Neil Lunn
谢谢,这很有帮助。我在文档中有没有忽略它的解释? - wscourge
1
空格分隔的列表在文档的开头某处提到。它取代了你提到的.populate().populate() - Neil Lunn
1
好的,谢谢。考虑将您有用的评论发布为答案,这可能会帮助其他人。 - wscourge
2个回答

21

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

0
这是嵌套填充的方法。在这种情况下,首先它将填充用户,然后填充用户的爱好,然后从用户的爱好中填充足球,然后它将从用户 -> 爱好 -> 足球中填充最喜欢的球员名称。
Model.find()
    .populate({
         path    : 'users',
         populate: [
             { path: 'Hobbies' },
             { 
                path    : 'Football',
                populate: {
                    path    : 'favouritePlayers',
                    populate: 'playerNames'
                }
             }
         ]
    });

5
虽然这段代码可能解决了问题,但是在回答中加入解释和说明如何以及为什么解决该问题将有助于提高您的帖子质量,并可能获得更多点赞。请记住,您正在回答未来的读者,而不仅仅是现在提问的人。请编辑您的回答以添加解释,并指出适用的限制和假设。 - Suraj Rao
请在您的回答中提供更多细节。目前的写法让人难以理解您的解决方案。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接