Mongodb Mongo按多个值聚合组

Mongodb Mongo按多个值聚合组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个Mongo查询,我想以与SQL中GROUPBY相同的方式有效地使用$group 这对我不起作用,除非我将新文档的_id设置为组类别之一,这对我不起作用,而且,我无法获得我想要的值,这些值可能来自我正在Mongo中合并的三个文档 在SQL中,我想写一些东西来说明我在Mongo中用作聚合基础的分组和选择: SELECT entity_id, connection_id, cycle_id, objectOriginAPI,accountBalance FROM raw_originBusin

我有一个Mongo查询,我想以与SQL中GROUPBY相同的方式有效地使用$group

这对我不起作用,除非我将新文档的_id设置为组类别之一,这对我不起作用,而且,我无法获得我想要的值,这些值可能来自我正在Mongo中合并的三个文档

在SQL中,我想写一些东西来说明我在Mongo中用作聚合基础的分组和选择:

SELECT entity_id, connection_id, cycle_id, objectOriginAPI,accountBalance
FROM raw_originBusinessData
WHERE objectStatus = 'UPROCESSED'
AND (objectOriginAPI = 'Profit & Loss'
OR objectOriginAPI = 'Balance Sheet'
OR objectOriginAPI = 'Bank Summary')
GROUP BY entity_id, connection_id, cycle_id;
为了简化我的Mongo脚本对嵌入式阵列的操作,我对其进行了解释

db.getCollection('raw_originBusinessData').aggregate([
 { "$match": {
  objectStatus : "UNPROCESSED"
  , $or: [
    { objectOriginAPI : "Profit & Loss"}
    ,{objectOriginAPI : "Balance Sheet"}
    ,{objectOriginAPI : "Bank Summary"}
    ]}
 },
       // don't worry about this, this is all good
 { "$unwind": "$objectRawOriginData.Reports" }
,{ "$unwind": "$objectRawOriginData.Reports.Rows" }
,{ "$unwind": "$objectRawOriginData.Reports.Rows.Rows" },

       // this is where I believe I'm having my problem
 { "$group": {"_id": "$entity_id"
       //    , "$connection_id"
       //    , "objectCycleID"
, "accountBalances": { "$push": "$objectRawOriginData.Reports.Rows.Rows.Cells.Value" }
 }},
{$project: {objectClass: {$literal: "Source Data"}
 , objectCategory: {$literal: "Application"}
 , objectType: {$literal: "Account Balances"}
 , objectOrigin: {$literal: "Xero"} 
 , entity_ID: "$_id"
 , connection_ID: "$connection_ID"
 , accountBalances: "$accountBalances"}
}
 ]
      // ,{$out: "std_sourceBusinessData"}
)
因此,我要合并到单个文档中的每个文档都具有相同的实体id、连接id和循环id,我希望将其放入新文档中。我还希望确保新文档具有自己的唯一对象id


非常感谢您的帮助-Mongo文档不包括关于$group的任何内容,除了_id是必需的,但是如果我没有将_id设置为我想要分组的对象(在上面的脚本中,它被设置为实体_id),它就不能正确分组。

简单地说,
\u id
需要是一个“复合”值,因此由三个“子键”组成:

{“$group”:{
“_id”:{
“实体id”:“$实体id”
“连接id”:“$connection\u id”,
“objectCycleID”:“$objectCycleID”
},
“账户余额”:{
“$push”:“$objectRawOriginData.Reports.Rows.Rows.Cells.Value”
}
}},
{“$project”:{
“_id”:0,
“objectClass”:{“$literal”:“源数据”},
“objectCategory”:{“$literal”:“Application”},
“objectType”:{“$literal”:“账户余额”},
“objectOrigin”:{“$literal”:“Xero”},
“实体ID”:“$\u ID.实体ID”,
“连接ID”:“$\u ID.连接ID”,
“账户余额”:“$accountBalances”
}}
当然,在后面的
$project
中引用这些值时,现在需要使用
$\u id
作为前缀,因为它现在是父键


与任何MongoDB文档一样,
\u id
可以是表示中有效的BSON对象。所以在这种情况下,组合意味着“在所有这些字段值上分组”。

这太棒了,非常有意义-它起作用了,你是明星!