【问题标题】:MongoDB aggregate group by sum of distinct columnMongoDB 按不同列的总和聚合组
【发布时间】:2015-10-20 03:17:04
【问题描述】:

我有以下示例数据的分析集合。

{ "_id" : ObjectId("55f996a4e4b0cc9c0a392594"), "action" : "apiUploadFile", "assetId" : "55f996a4e4b0cc9c0a392593" },
{ "_id" : ObjectId("5603d384e4b0cf75af10be88"), "action" : "agAsset",  "assetId" : "55f996a4e4b0cc9c0a392593"},
{ "_id" : ObjectId("5603d395e4b0cf75af10becc"), "action" : "aAD", "assetId" : "55f996a4e4b0cc9c0a392593" },
{ "_id" : ObjectId("5603d395e4b0cf75af10becd"), "action" : "mobCmd", "assetId" : "55f996a4e4b0cc9c0a392593", sessionId : "123"},
{ "_id" : ObjectId("5603d395e4b0cf75af10bece"), "action" : "mobCmd", "assetId" : "55f996a4e4b0cc9c0a392593", sessionId : "1234" },
{ "_id" : ObjectId("5603d395e4b0cf75af10becf"), "action" : "mobCmd", "assetId" : "55f996a4e4b0cc9c0a392593", sessionId : "1234" }

我需要按“assetId”查找分析组的总和,然后为每个“操作”类型查找。我想出了以下查询

db.analytics.aggregate(
    [
    {
        $match : { 
            'assetId' : { "$ne": null }
        }
    },
    {$group :{
            _id:
            {
                assId:'$assetId'
            },
            viewCount:{
                $sum:{
                    $cond: [ { $eq: [ '$action', 'agAsset' ] }, 1, 0 ]
                }
            },
            sessionCount:{
                $sum:{
                    $cond: [ { $eq: [ '$action', 'mobCmd' ] }, 1, 0 ]
                }
            }
        }
    }]
    )

这很好用,除了我无法使用不同的“sessionId”找到“sessionCount”。例如这里是当前输出

{ "_id" : { "assId" : "55f996a4e4b0cc9c0a392593" }, "viewCount" : 1,  "sessionCount" : 3 }

预期的输出是

{ "_id" : { "assId" : "55f996a4e4b0cc9c0a392593" }, "viewCount" : 1,  "sessionCount" : 2 }

我需要找到 action='mobCmd' 的 sessionCount 并具有 sessionIddistinct 值。如何在“sessionCount”部分的 $sum 操作中使用 distinct?

【问题讨论】:

  • 你想在这里做什么?目前还不清楚你在问什么。您当前的查询输出是什么?预期的结果是什么?
  • @user3100115 我刚刚用当前和预期的输出更新了帖子。谢谢你的检查。信息不足请评论

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

您需要将文档分组到复合 _id 字段中。

db.collection.aggregate([
    { "$match": { "assetId": { "$ne": null }}},
    { "$group": { 
        "_id": { "assId": "$assetId", "sessionId": "$sessionId" }, 
        "viewCount": { 
            "$sum": { 
                "$cond": [ 
                    { "$eq": [ "$action", "agAsset" ] }, 
                    1,
                    0 
                ] 
            }
         }, 
         "sessionCount": { 
             "$sum": { 
                 "$cond": [ 
                     { "$eq": [ "$action", "mobCmd" ] }, 
                     1, 
                     0 
                 ] 
             }
         }
     }}
])

产量:

{ "_id" : { "assId" : "55f996a4e4b0cc9c0a392593", "sessionId" : "1234" }, "viewCount" : 0, "sessionCount" : 2 }
{ "_id" : { "assId" : "55f996a4e4b0cc9c0a392593", "sessionId" : "123" }, "viewCount" : 0, "sessionCount" : 1 }
{ "_id" : { "assId" : "55f996a4e4b0cc9c0a392593" }, "viewCount" : 1, "sessionCount" : 0 }

或者使用$addToSet 运算符返回一个唯一的sessionId$unwind 数组,然后返回group 您的文档。

db.collection.aggregate([
    { "$match": { "assetId": { "$ne": null }}}, 
    { "$group": { 
        "_id": "$assetId", 
        "sessionId": { "$addToSet": "$sessionId" }, 
        "viewCount": { 
            "$sum": { 
                "$cond": [ 
                    { "$eq": [ "$action", "agAsset" ] },
                    1, 
                    0
                ] 
            }
        }
    }}, 
    { "$unwind": "$sessionId" }, 
    { "$group": { 
        "_id": "$_id", 
        "viewCount": { "$first": "$viewCount" },  
        "sessionCount": { "$sum": 1 } 
    }}
])

返回:

{ "_id" : "55f996a4e4b0cc9c0a392593", "viewCount" : 1, "sessionCount" : 2 } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2014-05-10
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多