MongoDB聚合:如何在数组值中分组?

70gysomp  于 2023-01-20  发布在  Go
关注(0)|答案(1)|浏览(138)

例如,文档。

[
  {
    "username": "joy",
    "size_info": [
      {
        "size": "M",
        "width": 100,
        "height": 102
      },
      {
        "size": "M",
        "width": 102,
        "height": 104
      },
      {
        "size": "S",
        "width": 80,
        "height": 82
      }
    ]
  }
]

我想对size_info.size进行分组,并推送宽度和高度为的数组。
我正在尝试创建聚合查询。例如,对于上面给定的文档,它将如下所示:

[
  {
    "username": "joy",
    "size_info": [
      {
        "size": "M",
        "actual_size": [
          {
            "width": 100,
            "height": 102
          },
          {
            "width": 102,
            "height": 104
          }
        ]
      },
      {
        "size": "S",
        "actual_size": [
          {
            "width": 80,
            "height": 82
          }
        ]
      }
    ]
  }
]

有可能吗?谢谢你的帮助。

jdgnovmf

jdgnovmf1#

  1. $unwind-将size_info数组分解为多个文档。
  2. $group-按usernamesize_info.size分组,将文档加入actual_size数组。
  3. $group-按username分组,将文档加入size_info数组。
  4. $project-装饰输出文档。
db.collection.aggregate([
  {
    $unwind: "$size_info"
  },
  {
    $group: {
      _id: {
        username: "$username",
        size: "$size_info.size"
      },
      actual_size: {
        $push: {
          width: "$size_info.width",
          height: "$size_info.height"
        }
      }
    }
  },
  {
    $group: {
      _id: "$_id.username",
      size_info: {
        $push: {
          size: "$_id.size",
          actual_size: "$actual_size"
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      username: "$_id",
      size_info: 1
    }
  }
])

Sample Mongo Playground

相关问题