Mongodb聚合管道$group并将具有键/值对的对象返回到结果组
我有一个ClientField集合,它的属性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
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" } }
}
])