如何在MongoDB中使用find或aggregate获取嵌套数组的匹配对象?
MongoDB查询:过滤嵌套数组仅保留status为true的元素
你用{canReview.status: true}查询只能筛选出包含至少一个status=true元素的文档,但不会修改数组内容——原数组里的false元素依然会保留,这就是没得到期望结果的原因。要实现仅保留数组中status=true的元素,需要结合筛选和数组过滤操作,下面是两种可行方案:
方法一:聚合管道(推荐,支持保留所有匹配元素)
通过$match先筛选出符合条件的文档,再用$filter过滤数组元素,是最通用的解决方案。
db.collection.aggregate([ // 第一步:排除完全没有status=true元素的文档 { $match: { "canReview.status": true } }, // 第二步:过滤canReview数组,只保留status为true的元素 { $addFields: { canReview: { $filter: { input: "$canReview", cond: { $eq: ["$$this.status", true] } } } } } ])
步骤说明:
$match阶段:先把像_id=2这类canReview全是false的文档排除,减少后续处理的数据量。$addFields阶段:用$filter遍历canReview数组,只保留满足status=true的元素,替换原数组字段。
运行后得到的结果完全符合你的期望:
[ { "_id": 1, "name": "aaaa", "canReview": [ { "status": true } ] } ]
方法二:投影(仅适用于数组最多一个匹配元素的场景)
如果你的canReview数组里最多只有一个status=true的元素,可以用$elemMatch在投影中过滤,但这个方法只会返回数组中第一个匹配的元素,无法保留多个匹配项,所以局限性较大。
db.collection.find( { "canReview.status": true }, { "canReview": { $elemMatch: { status: true } }, name: 1, _id: 1 } )
内容的提问来源于stack exchange,提问作者Atul Pisal
相关产品推荐
相关产品推荐

