我有一个Mongo查询,我希望以与SQL中的GROUP BY相同的方式有效地使用$ group。
这对我不起作用,除非我将新文档的_id设置为对我不起作用的组类别之一,而且,我无法获得可能来自三个文档的我想要的值我在Mongo合并。
在SQL中,我会写一些类似于说明分组的内容,并选择我用作Mongo聚合的基础:
.query
我已经解释了我的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;
因此,我合并到单个文档中的每个文档都具有相同的entity_id,connection_id和cycle_id,我想将其放入新文档中。我还想确保新文档具有自己唯一的object_id。
非常感谢你的帮助 - Mongo文档没有涵盖除了_id之外的$ group是强制性的,但如果我没有将_id设置为我想要分组的东西(在上面的脚本中它被设置到entity_id)它没有正确分组。
答案 0 :(得分:1)
简单地说,_id
需要是"复合"值,因此由三个"子键组成":
{ "$group":{
"_id": {
"entity_id": "$entity_id"
"connection_id": "$connection_id",
"objectCycleID": "$objectCycleID"
},
"accountBalances": {
"$push": "$objectRawOriginData.Reports.Rows.Rows.Cells.Value"
}
}},
{ "$project": {
"_id": 0,
"objectClass": { "$literal": "Source Data" },
"objectCategory": { "$literal": "Application"},
"objectType": { "$literal": "Account Balances"},
"objectOrigin": { "$literal": "Xero"},
"entity_ID": "$_id.entity_id",
"connection_ID": "$_id.connection_id",
"accountBalances": "$accountBalances"
}}
当然,在后面的$project
中引用这些值中的任何一个都需要您现在使用$_id
前缀,因为它现在是父键。
与任何MongoDB文档一样,_id
可以是表示中有效BSON对象的任何内容。因此,在这种情况下,组合意味着"对所有这些字段值进行分组" 。