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

使用SQL++查询过滤多层嵌套数组的实现方法

MongoDB嵌套数组过滤解决方案

针对你需要筛选出包含tr.x = "VALID"且check = false的文档,并剔除不符合条件的tr元素(同时移除无有效tr的p元素、无有效p的i元素)的需求,可以通过MongoDB的聚合管道实现,具体步骤如下:

聚合管道代码

db.collection.aggregate([
  // 先筛选出至少存在符合条件tr元素的文档,减少后续计算量
  {
    $match: {
      "i.p.tr": {
        $elemMatch: {
          x: "VALID",
          check: false
        }
      }
    }
  },
  // 处理嵌套数组,过滤掉不符合条件的元素
  {
    $set: {
      i: {
        $filter: {
          input: {
            $map: {
              input: "$i",
              as: "item",
              in: {
                // 保留i元素原有字段
                i1: "$$item.i1",
                i2: "$$item.i2",
                p: {
                  $filter: {
                    input: {
                      $map: {
                        input: "$$item.p",
                        as: "pItem",
                        in: {
                          // 保留p元素原有字段
                          id: "$$pItem.id",
                          p2: "$$pItem.p2",
                          tr: {
                            // 过滤tr数组,只保留符合条件的元素
                            $filter: {
                              input: "$$pItem.tr",
                              as: "trItem",
                              cond: {
                                $and: [
                                  { $eq: ["$$trItem.x", "VALID"] },
                                  { $eq: ["$$trItem.check", false] }
                                ]
                              }
                            }
                          }
                        }
                      }
                    },
                    // 过滤掉tr数组为空的p元素
                    as: "filteredP",
                    cond: { $ne: ["$$filteredP.tr", []] }
                  }
                }
              }
            }
          },
          // 过滤掉p数组为空的i元素
          as: "filteredI",
          cond: { $ne: ["$$filteredI.p", []] }
        }
      }
    }
  }
])

代码解释

  • $match阶段:先定位出包含符合条件tr元素的文档,避免对完全不符合的文档做后续处理,提升效率。
  • $set阶段:重新构建i数组,逐层处理嵌套结构:
    1. 遍历i数组,保留每个i元素的原有字段,同时处理其内部的p数组。
    2. 遍历p数组,保留每个p元素的原有字段,用$filter筛选出tr中满足x="VALID"且check=false的元素。
    3. 过滤掉tr数组为空的p元素,再过滤掉p数组为空的i元素,最终得到干净的嵌套结构。

执行结果

运行上述聚合管道后,会返回你期望的结果:

{
  "version": 1,
  "root1": "root1",
  "root2": "root2",
  "i": [
    {
      "i1": "i1",
      "i2": "i2",
      "p": [
        {
          "id": 1,
          "p2": "p2",
          "tr": [
            {
              "id": 1,
              "x": "VALID",
              "check": false
            }
          ]
        }
      ]
    }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:22:56