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

MongoDB聚合:基于嵌套数组属性过滤文档的实现问询

MongoDB聚合查询解决方案

需求分析

当文档的array数组中至少一个元素满足:其nestedArray2.valueToFilter值(ObjectId类型)不存在于对应元素的nestedArray.value集合(字符串类型)中时,返回该文档的_id和完整array属性;若所有元素的valueToFilter均匹配对应nestedArray.value,则不返回该文档。

聚合管道实现

[
  {
    $match: {
      $expr: {
        $anyElementTrue: {
          $map: {
            input: "$array",
            as: "elem",
            in: {
              $anyElementTrue: {
                $map: {
                  input: "$$elem.nestedArray2",
                  as: "nf",
                  in: {
                    $not: {
                      $in: [
                        "$$nf.valueToFilter",
                        { $map: { input: "$$elem.nestedArray", as: "n", in: { $toObjectId: "$$n.value" } } }
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    $project: {
      _id: 1,
      array: 1
    }
  }
]

逻辑说明

  1. 类型统一:通过$toObjectId将nestedArray.value的字符串类型转换为ObjectId,与nestedArray2.valueToFilter的类型保持一致,确保比较准确。
  2. 层级判断:
    • 内层$map + $anyElementTrue:检查单个array元素的nestedArray2中是否存在valueToFilter不在对应nestedArray.value集合中的情况。
    • 外层$map + $anyElementTrue:判断整个文档的array数组中是否存在至少一个符合上述条件的元素。
  3. 结果投影:仅返回符合条件文档的_id和完整array属性。

示例验证

针对提供的测试文档,array中的name2元素的nestedArray2.valueToFilter(ObjectId("661564ce168c8115295a8f29"))不在其nestedArray.value集合中,因此该文档会被返回,结果如下:

{
  "_id": 1,
  "array": [
    {
      "name": "name1",
      "nestedArray": [ { "value": "661564ce168c8115295a8f25" } ],
      "nestedArray2": [ { "valueToFilter": ObjectId("661564ce168c8115295a8f25") } ]
    },
    {
      "name": "name2",
      "nestedArray": [ { "value": "661564ce168c8115295a8f27" }, { "value": "661564ce168c8115295a8f28" } ],
      "nestedArray2": [ { "valueToFilter": ObjectId("661564ce168c8115295a8f29") } ]
    }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:41:21