根据 mongodb 聚合中另一个数组的属性过滤数组

问题描述 投票:0回答:1

假设我有这份文件

[
  {
    "_id": 1,
    "array": [
      {
        "name": "name1",
        "nestedArray": [
          {
            "value": "v1"
          }
        ],
        "nestedArray2": [
          {
            "valueToFilter": "v1"
          }
        ]
      },
      {
        "name": "name2",
        "nestedArray": [
          {
            "value": "v1"
          },
                    {
            "value": "v2"
          }
        ],
        "nestedArray2": [
          {
            "valueToFilter": "v3"
          }
        ]
      }
    ]
  }
]

我需要的是如果nestedArray2.valueToFilter中至少有一项不存在于nestedArray.value中,则获取_id和整个array

属性

因此,在此示例中,聚合将返回此文档,因为至少一个 nestedArray.value 中不存在 nestedArray2.valueToFilter: v3

如果所有 valueToFilter 都存在于至少一个nestedArray.value中,则不要获取此文档

mongodb aggregation-framework
1个回答
0
投票

一般来说,我不推荐具有高度嵌套数组的模式。不过,在您的场景中,您可以首先对

array
执行逐元素操作,以计算
$setIntersection
nestedArray
$nestedArray2
。然后,使用
$anyElementTrue
过滤结果。

db.collection.aggregate([
  {
    "$set": {
      "test": {
        "$map": {
          "input": "$array",
          "as": "arr",
          "in": {
            "$setIntersection": [
              "$$arr.nestedArray.value",
              "$$arr.nestedArray2.valueToFilter"
            ]
          }
        }
      }
    }
  },
  {
    "$match": {
      $expr: {
        "$anyElementTrue": {
          "$map": {
            "input": "$test",
            "as": "t",
            "in": {
              $eq: [
                [],
                "$$t"
              ]
            }
          }
        }
      }
    }
  },
  {
    $unset: "test"
  }
])

蒙戈游乐场


上面的游乐场演示了这些概念。您可以使用以下版本以获得简洁的语法。 蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.