MongoDB 按公共字段聚合组结果查询

MongoDB Aggregate Group Results Query by Common Fields

想弄清楚如何通过查询对 Mongo 文档执行特定分组,而不是在获取数据后通过代码转换结果。

示例模拟数据:

[
    { 'id': 1, 'status': 'EMPTY', 'name': 'ALBERT' },
    { 'id': 2, 'status': 'EMPTY', 'name': 'ERIC' },
    { 'id': 3, 'status': 'EMPTY', 'name': 'ALBERT' },
    { 'id': 4, 'status': 'EMPTY', 'name': 'ALBERT' },
    { 'id': 5, 'status': 'EMPTY', 'name': 'JESSICA' },
    { 'id': 6, 'status': 'EMPTY', 'name': 'ERIC' },
    ...
]

我的聚合查询:

db.results.aggregate([
    { 
        $match: {
            'status': 'EMPTY'
        }
    },
    ???
])

我想transform/sort将结果转换成这样的对象:

{
    'ALBERT': [
        { 'id': 1, 'status': 'EMPTY', 'name': 'ALBERT' },
        { 'id': 3, 'status': 'EMPTY', 'name': 'ALBERT' },
        { 'id': 4, 'status': 'EMPTY', 'name': 'ALBERT' },
    ],
    'ERIC': [
        { 'id': 2, 'status': 'EMPTY', 'name': 'ERIC' },
        { 'id': 6, 'status': 'EMPTY', 'name': 'ERIC' }
    ],
    'JESSICA': [
        { 'id': 5, 'status': 'EMPTY', 'name': 'JESSICA' }
    ]
}

在线查看文档有点困难,因为我什至不确定这种类型的转换叫什么,或者我应该在 Mongo 中使用什么聚合器。因此,任何指向正确方向的观点都将不胜感激!

谢谢!!

试试这个:

db.collection.aggregate([
  { $unset: "_id" },
  {
    $group: {
      _id: "$name",
      data: { $push: "$$ROOT" }
    }
  },
  {
    $project: {
      data: {
        k: "$_id",
        v: "$data"
      }
    }
  },
  { $replaceRoot: { newRoot: { $arrayToObject: "$data" } } },
  {
    $group: {
      _id: null,
      data: { $push: "$$ROOT" }
    }
  },
  { $replaceRoot: { newRoot: { $mergeObjects: "$data" } } }
])

Mongo Playground