我有一个ClientField集合,其属性为map_type
,可以是“转换”,“默认”或“ json”。我想按map_type对所有客户端字段进行分组,并将结果作为对象而不是数组。仅使用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" } } }
]);
返回带有fields
数组的组数组:
[
{ _id: 'default', fields: [ContactField] },
{ _id: 'conversion', fields: [ContactField] },
{ _id: 'json', fields: [ContactField] }
]
我想要的结果是:
{
default: [ClientField],
conversion: [ClientField],
json: [ClientField]
}
答案 0 :(得分:1)
您需要使用另一个$group将所有分组结果收集到一个文档中。然后,您可以运行$arrayToObject来将上一个分组function abc() {
var ss=SpreadsheetApp.getActive();
var sh0=ss.getSheetByName("CA_SHEET_00");
var vA=sh0.getRange(2,1,sh0.getLastRow()-1,12).getValues();
var sh1=ss.getSheetByName("AA_01")
var vB=sh1.getRange(2,1,sh1.getLastRow()-1,12).getValues();
for(var i=0;i<vA.length;i++) {
for(var j=0;j<vB.length;j++) {
if(vA[i][0]==vB[j][0]){
sh0.getRange(2+i,13).setValue(Utilities.formatString('%s,%s,%s',vA[i][11],vA[i][3],vB[i][4]));
sh1.getRange(2+j,13).setValue(vA[i][3]);
}
}
}
}
设置为键,并运行$replaceRoot将该新对象提升到顶层:
_id