【问题标题】:Filter by nested arrays/objects values (on different levels) and $project by matching groups (on a specific level) - MongoDB Aggregate按嵌套数组/对象值(在不同级别)和 $project 通过匹配组(在特定级别)过滤 - MongoDB Aggregate
【发布时间】:2020-04-12 14:03:17
【问题描述】:

考虑到我有以下集合(忽略文档_id):

收藏

[
  {
    "Id": "1",
    "Level2": [
      {
        "Id": "1.1",
        "Level3": [
          {
            "Id": "1.1.1",
            "Level4": [
              {
                "Id": "1.1.1.1",
                "Status": "a"
              },
              {
                "Id": "1.1.1.2",
                "Status": "b"
              }
            ]
          },
          {
            "Id": "1.1.2",
            "Level4": [
              {
                "Id": "1.1.2.1",
                "Status": "a"
              },
              {
                "Id": "1.1.2.2",
                "Status": "c"
              }
            ]
          },
          {
            "Id": "1.1.3",
            "Level4": [
              {
                "Id": "1.1.3.1",
                "Status": "c"
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "Id": "2",
    "Level2": [
      {
        "Id": "2.1",
        "Level3": [
          {
            "Id": "2.1.1",
            "Level4": [
              {
                "Id": "2.1.1.1",
                "Status": "a"
              }
            ]
          }
        ]
      }
    ]
  }
]

条件

我想查询如:

  • Level2.Id: "1.1"
  • Level2.Level3.Level4.Status $in ["a", "b"]

$project 应该:

  • Level2.Level3.Level4 匹配Level2.Level3
  • 如果是空数组,则不应包含Level2.Level3

预期结果应该是:

结果 1

[
  {
    "Id": "1.1.1",
    "Level4": [
      {
        "Id": "1.1.1.1",
        "Status": "a"
      },
      {
        "Id": "1.1.1.2",
        "Status": "b"
      }
    ]
  },
  {
    "Id": "1.1.2",
    "Level4": [
      {
        "Id": "1.1.2.1",
        "Status": "a"
      }
    ]
  }
]

请注意,如果当前Level2.Id: "2.1" 的值为"1.1",则结果应为(在不同文档上匹配)

结果 2

[
  {
    "Id": "1.1.1",
    "Level4": [
      {
        "Id": "1.1.1.1",
        "Status": "a"
      },
      {
        "Id": "1.1.1.2",
        "Status": "b"
      }
    ]
  },
  {
    "Id": "1.1.2",
    "Level4": [
      {
        "Id": "1.1.2.1",
        "Status": "a"
      }
    ]
  },
  {
    "Id": "2.1.1",
    "Level4": [
      {
        "Id": "2.1.1.1",
        "Status": "a"
      }
    ]
  }
]

如何使用 aggregate 查询来完成此操作?

(过滤不同的级别并按某个级别分组)

【问题讨论】:

标签: mongodb mongodb-query aggregation-framework pymongo


【解决方案1】:

这就是答案(感谢@Vijay Rajpurohit 对此提供的帮助):

db.collection.aggregate([
  {
    $unwind: "$Level2"
  },
  {
    $unwind: "$Level2.Level3"
  },
  {
    $unwind: "$Level2.Level3.Level4"
  },
  {
    $match: {
      "Level2.Id": "1.1",
      "Level2.Level3.Level4.Status": {
        $in: [
          "a",
          "b"
        ]
      }
    }
  },
  {
    $group: {
      "_id": "$Level2.Level3.Id",
      "Messages": {
        $push: "$Level2.Level3.Level4"
      }
    }
  }
])

这个查询的结果是:

[
  {
    "Messages": [
      {
        "Id": "1.1.2.1",
        "Status": "a"
      }
    ],
    "_id": "1.1.2"
  },
  {
    "Messages": [
      {
        "Id": "1.1.1.1",
        "Status": "a"
      },
      {
        "Id": "1.1.1.2",
        "Status": "b"
      }
    ],
    "_id": "1.1.1"
  }
]

Mongo Playground

【讨论】:

    猜你喜欢
    • 2021-06-14
    • 2021-12-13
    • 1970-01-01
    • 2021-12-21
    • 2021-12-23
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多