Mongodb Mongo按多个值聚合组
我有一个Mongo查询,我想以与SQL中GROUPBY相同的方式有效地使用$group 这对我不起作用,除非我将新文档的_id设置为组类别之一,这对我不起作用,而且,我无法获得我想要的值,这些值可能来自我正在Mongo中合并的三个文档 在SQL中,我想写一些东西来说明我在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
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对象。所以在这种情况下,组合意味着“在所有这些字段值上分组”。这太棒了,非常有意义-它起作用了,你是明星!