如何在 MongoDB 中的 $group 中创建嵌套数组?

How to create nested array inside $group in MongoDB?

经过一些聚合管道阶段后,我的 MongoDB 文档具有以下格式:

{
    "key": "A",
    "status": "To Do",
    "val": 4
  },
  {
    "key": "A",
    "status": "Done",
    "val": 1
  },
  {
    "key": "A",
    "status": "To Do",
    "val": 3
  },
  {
    "key": "A",
    "status": "Done",
    "val": 2
  },
  {
    "key": "B",
    "status": "Done",
    "val": 5
  },
  {
    "key": "B",
    "status": "Done",
    "val": 6
  }

预期输出:

  1. 分组依据key
  2. 分组依据status
  3. 推送val
  {
    "key": "A",
    "status_val": [
      {
        "status": "To Do",
        "val": [
          3,
          4
        ]
      },
      {
        "status": "Done",
        "val": [
          1,
          2
        ]
      }
    ]
  },
  {
    "key": "B",
    "status_val": "Done",
    "val": [
      5,
      6
    ]
  }

这是我尝试过的:

db.collection.aggregate([
          {
            $group: {
            _id: {
              
              key:"$key",
              status:"$status"
            },
              v: {
               $push:  "$val"
               }
           }
         },
         {
            $group: {
            _id: "$_id.key",
              status_val: {
               $addToSet: {
                 status: "$_id.status",
                 val: "$_id.v"
               }
           }
         }},
         {
    $project: { _id: 0,key:"$_id",status_val:1 }
  }
]).pretty()

但是我得到了错误的输出:

[
  {
    "key": "B",
    "status_val": [
      {
        "status": "Done"
      }
    ]
  },
  {
    "key": "A",
    "status_val": [
      {
        "status": "Done"
      },
      {
        "status": "To Do"
      }
    ]
  }
]

如何在 $group 中获取嵌套数组?

你正确 运行 $group 两次,但需要更改此行:

val: "$_id.v"

v 不是 _id 的一部分,第一个 $group 之后的数据如下所示:

{
    "_id": { "key": "B, "status": "Done" },
    "v": [ 5, 6 ]
}

尝试:

db.collection.aggregate([
    {
        $group: {
            _id: { key: "$key", status: "$status" },
            val: { $push: "$val" }
        }
    },
    {
        $group: {
            _id: "$_id.key",
            status_val: {
                $push: {
                    status: "$_id.status",
                    val: "$val"
                }
            }
        }
    },
    {
        $project: {
            _id: 0,
            key: "$_id",
            status_val: 1
        }
    }
])

Mongo Playground