我有一个Mongo查询,我希望以与SQL中的GROUP BY相同的方式有效地使用$ 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"}
)
因此,我合并到单个文档中的每个文档都具有相同的entity_id,connection_id和cycle_id,我想将其放入新文档中 . 我还想确保新文档具有自己唯一的object_id .
非常感谢你的帮助 - Mongo文档没有涵盖除了_id以外的$ group是强制性的,但是如果我没有将_id设置为我要分组的东西(在上面的脚本中它被设置为entity_id)它没有正确分组 .
1 回答
简而言之,
_id
需要是一个"composite"值,因此由三个"sub-keys"组成:然后,当然,在后面的
$project
中引用这些值中的任何一个都需要现在前缀为$_id
,因为它现在是父键 .与任何MongoDB文档一样,
_id
可以是表示中有效BSON对象的任何内容 . 所以在这种情况下,组合意味着"group on all these field values" .