Mongo聚合组由多个值组成

时间:2015-12-14 21:28:50

标签: mongodb mongodb-query aggregation-framework

我有一个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)它没有正确分组。

1 个答案:

答案 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对象的任何内容。因此,在这种情况下,组合意味着"对所有这些字段值进行分组"