You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:24:05