MongoDB中如何搭配$in与$cond通过$redact实现文档过滤
问题根因
你原来的写法错误核心是 $data._id 返回的是所有data元素的_id组成的数组(比如第一个文档返回 [41,42,43]),而$in运算符在这里是判断「左侧整个数组是否是右侧数组的元素」,显然不成立,所以所有文档都被判定为$$PRUNE,无结果返回。
解决方法
方案1:坚持使用$redact阶段的正确写法
需要先判断data._id数组中是否存在任意元素落在目标范围内,用$anyElementTrue配合遍历判断即可:
{ $redact: { $cond: { if: { $anyElementTrue: { $map: { input: "$data._id", in: { $in: [ "$$this", [41,42] ] } } } }, then: "$$KEEP", else: "$$PRUNE" } } }
方案2:更简洁的$match实现(推荐)
你的需求只是按条件过滤整文档,不需要用到$redact的递归字段权限控制能力,直接用$match阶段就能实现,性能更高、写法更简单:
{ $match: { "data._id": { $in: [41,42] } } }
MongoDB对数组字段的查询原生支持「匹配任意数组元素符合条件」的逻辑,上述写法会自动保留所有存在data元素_id在[41,42]范围内的整文档。
内容的提问来源于stack exchange,提问作者TheDoomDestroyer
相关产品推荐
相关产品推荐

