过滤深度嵌套数组中的元素

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

我有一个如下的集合:

[
  {
    "array1": [
      {
        "array2": [
          {
            "array3": [ 1, 2 ]
          },
          {
            "array3": [ 2, 3 ]
          },
          {
            "array3": [ 3, 4 ]
          },
          {
            "array3": [ 4, 5 ]
          }
        ]
      }
    ]
  }
]

并且我只想过滤

array2
中包含 1 或 5 的
array3
元素。
像这样的输入:

[
  {
    "array1": [
      {
        "array2": [
          {
            "array3": [ 1, 2 ]
          },
          {
            "array3": [ 4, 5 ]
          }
        ]
      }
    ]
  }
]

我尝试使用此聚合的

$filter
运算符,但它没有按预期工作。

db.collection.aggregate([
  {
    "$project": {
      "array1.array2": {
        $filter: {
          "input": "$array1.array2",
          "cond": {
            "$in": [
              "$$this.array3",
              [ 1, 5 ]
            ]
          }
        }
      }
    }
  }
])

蒙戈游乐场

mongodb multidimensional-array aggregation-framework
1个回答
1
投票

认为您应该迭代

array1
数组中的每个元素,并通过
array2
$setIntersection
(不等于空数组)运算符过滤
$ne
数组中包含1、5的元素。

db.collection.aggregate([
  {
    "$addFields": {
      "array1": {
        $filter: {
          input: {
            $map: {
              input: "$array1",
              as: "array1",
              in: {
                array2: {
                  $filter: {
                    input: "$$array1.array2",
                    cond: {
                      $ne: [
                        {
                          $setIntersection: [
                            "$$this.array3",
                            [
                              1,
                              5
                            ]
                          ]
                        },
                        []
                      ]
                    },
                    
                  }
                }
              }
            }
          },
          cond: {
            $ne: [
              "$$this.array2",
              []
            ]
          }
        }
      }
    }
  }
])

演示@Mongo Playground

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