MongoDB聚合:移除嵌套数组指定元素(是否用$redact?)
解决MongoDB聚合中保留原结构过滤数组元素的问题
嘿,我来帮你搞定这个MongoDB的聚合需求!你需要保留原文档的完整结构,同时只保留items数组中partNum为"1200664"的元素,还不能用$unwind或$replaceRoot,其实用$project配合$filter操作符就能完美解决,比$redact更直接高效。
正确的聚合管道
db.collection.aggregate([ { $project: { recType: 1, progCount: 1, items: { $filter: { input: "$items", cond: { $eq: ["$$this.partNum", "1200664"] } } } } } ])
代码解释
$project阶段:保留原文档的recType和progCount字段(用1表示保留),同时对items数组进行针对性处理。$filter操作符:专门用于数组元素的精准筛选,input指定要处理的原数组($items),cond定义筛选规则——用$$this指代数组中的当前元素,判断其partNum是否等于目标值"1200664"。处理后items数组只会留下符合条件的元素,完全保留了原文档的层级结构,完美匹配你的要求。
为什么$redact不适合这个场景?
$redact的核心定位是文档访问权限控制,它通过递归遍历文档层级,结合$$DESCEND/$$PRUNE/$$KEEP来决定保留或剔除内容,更适合处理复杂的嵌套文档权限过滤场景。用它来实现单纯的数组元素筛选,需要编写复杂的递归判断逻辑,既不直观也没必要,$filter才是这个需求下的最优解。
内容的提问来源于stack exchange,提问作者watery
相关产品推荐
相关产品推荐

