首页 文章

Mongo聚合组由多个值组成

提问于
浏览
1

我有一个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 回答

  • 1

    简而言之, _id 需要是一个"composite"值,因此由三个"sub-keys"组成:

    { "$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对象的任何内容 . 所以在这种情况下,组合意味着"group on all these field values" .

相关问题