Mongodb聚合管道$group并将具有键/值对的对象返回到结果组

Mongodb聚合管道$group并将具有键/值对的对象返回到结果组,mongodb,mongoose,Mongodb,Mongoose,我有一个ClientField集合,它的属性map\u type,可以是“conversion”、“default”或“json”。我希望按map_类型对所有客户端字段进行分组,并将结果设置为对象而不是数组。仅使用Mongodb聚合管道可以做到这一点吗 //Example ClientField Object { "client_name" : "StackOverflow", "map_type" : "conversion", "push_type" : "profi

我有一个ClientField集合,它的属性
map\u type
,可以是“conversion”、“default”或“json”。我希望按map_类型对所有客户端字段进行分组,并将结果设置为对象而不是数组。仅使用Mongodb聚合管道可以做到这一点吗

//Example ClientField Object
{
    "client_name" : "StackOverflow",
    "map_type" : "conversion",
    "push_type" : "profile",
    "name" : "dateOfBirth",
    "conversion" : {
        "method" : "dateOfBirth",
        "params" : "dateOfBirth"
    },
    "json_path" : "dateOfBirth",
    "e_field_id" : "4",
}
我目前的汇总管道是:

const fieldGroups = await ClientField.aggregate([
    { $match: { client_name: this.name, push_type: push_type } },
    { $group: { _id: "$map_type", fields: { $push: "$$ROOT" } } }
]);

它返回带有
字段的组数组
数组:

[ 
  { _id: 'default', fields: [ContactField] },
  { _id: 'conversion', fields: [ContactField] },
  { _id: 'json', fields: [ContactField] } 
]
我期望的结果是:

{
  default: [ClientField],
  conversion: [ClientField],
  json: [ClientField]
}

您需要使用另一个文档将所有分组结果收集到一个文档中。然后,您可以运行以将上一阶段分组
\u id
设置为键,并运行以将新对象升级到顶级:

db.collection.aggregate([
    // $match
    {
        $group: {
            _id: "$map_type",
            fields: {
                $push: "$$ROOT"
            }
        }
    },
    {
        $group: {
            _id: null,
            root: { $push: { k: "$_id", v: "$fields" } }
        }
    },
    {
        $replaceRoot: { newRoot: { $arrayToObject: "$root" } }
    }
])