如何在MongoDB中查询嵌套文档并返回精确匹配的嵌套字段
问题原因
你使用的普通find查询只能筛选出至少包含1个status为suspended的accounts嵌套文档的父级leads文档,默认会返回完整的accounts数组,不会过滤数组内不符合条件的元素。
解决方案
方案1:返回所有匹配的嵌套accounts文档
如果需要返回一个父文档下所有status为suspended的accounts元素,使用聚合管道实现:
db.getCollection('leads').aggregate([ // 筛选符合条件的父文档 { $match: { "accounts.status": "suspended" } }, // 过滤accounts数组,仅保留匹配项 { $project: { // 不需要返回_id的话可添加 _id: 0 accounts: { $filter: { input: "$accounts", as: "account", cond: { $eq: ["$$account.status", "suspended"] } } } // 这里可以追加其他需要返回的父级字段,比如 name: 1 之类的 } } ])
方案2:仅返回第一个匹配的嵌套accounts文档
如果只需取数组里第一个符合条件的元素,可以直接用find的$elemMatch投影:
db.getCollection('leads').find( { "accounts.status": "suspended" }, { accounts: { $elemMatch: { status: "suspended" } } } )
注意:该方案如果遇到一个父文档下有多个符合条件的accounts元素时,只会返回第一个匹配结果。
内容的提问来源于stack exchange,提问作者Tapas Karmakar
相关产品推荐
相关产品推荐

