【问题标题】:Mongo aggregate group by multiple valuesMongo 按多个值聚合分组
【发布时间】:2016-03-20 12:26:57
【问题描述】:

我有一个 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 文档不包含任何关于 $group 的内容,除了 _id 是强制性的,但如果我没有将 _id 设置为我想要分组的东西(在上面的脚本中它被设置到 entity_id)它没有正确分组。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案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 对象的东西。所以在这种情况下,组合意味着“对所有这些字段值进行分组”

    【讨论】:

    • 这太棒了,非常有意义 - 它正在工作,你是明星!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2020-08-26
    相关资源
    最近更新 更多