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

时间:2019-12-16 04:31:13

标签: mongodb mongoose

我有一个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]
}

1 个答案:

答案 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