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

如何在MongoDB投影阶段过滤嵌套数组?

解决MongoDB双层嵌套数组的过滤问题

你的问题出在直接对$list_L1.obj_L1.list_L2使用$filter时,list_L1本身是数组,这个表达式会返回数组的数组,而$filter只能处理单个数组,导致无法正确遍历内层元素,最终得到空数组。

正确的做法是先通过$map遍历外层的list_L1数组,再对每个元素内部的obj_L1.list_L2执行$filter,完整聚合管道如下:

db.collection.aggregate([
  // 筛选包含符合条件元素的文档
  {$match: { "list_L1.obj_L1.list_L2.go": "Y"}},
  // 遍历外层数组,过滤内层数组元素
  {$addFields: {
    "list_L1": {
      $map: {
        input: "$list_L1",
        as: "l1_item",
        in: {
          obj_L1: {
            list_L2: {
              $filter: {
                input: "$$l1_item.obj_L1.list_L2",
                as: "l2_item",
                cond: { $eq: ["$$l2_item.go", "Y"] }
              }
            }
          }
        }
      }
    }
  }}
])

执行逻辑说明

  1. $match阶段:保留所有包含list_L2.go = "Y"元素的文档,排除id=2这类完全不符合的文档。
  2. $addFields阶段:
    • 用$map遍历list_L1中的每个元素(命名为l1_item)。
    • 对每个l1_item内部的obj_L1.list_L2数组,用$filter筛选出go字段等于"Y"的元素。
    • 替换原list_L1字段为处理后的结果,保持原文档结构不变。

执行后会得到你预期的输出:仅保留list_L2中go="Y"的元素,同时保留外层文档的结构。

内容的提问来源于stack exchange,提问作者arielCo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:41:02