MongoDB按不同列之和聚合组

MongoDB按不同列之和聚合组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有以下样本数据的分析收集 { "_id" : ObjectId("55f996a4e4b0cc9c0a392594"), "action" : "apiUploadFile", "assetId" : "55f996a4e4b0cc9c0a392593" }, { "_id" : ObjectId("5603d384e4b0cf75af10be88"), "action" : "agAsset", "assetId" : "55f996a4e4b0cc9c0a392593"}, { "_id

我有以下样本数据的分析收集

{ "_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,并为
sessionId
提供
distinct
值。如何使用“sessionCount”部分的distinct inside$sum操作?

您需要在复合
\u id
字段中对文档进行分组

db.collection.aggregate([
{“$match”:{“assetId”:{“$ne”:null}},
{“$group”:{
“_id”:{“assId”:“$assetId”,“sessionId”:“$sessionId”},
“视图计数”:{
“$sum”:{
“$cond”:[
{“$eq”:[“$action”,“agAsset”]},
1.
0
] 
}
}, 
“sessionCount”:{
“$sum”:{
“$cond”:[
{“$eq”:[“$action”,“mobCmd”]},
1.
0
] 
}
}
}}
])
这将产生:

{u id:{“assId”:“55f996a4e4b0cc9c0a392593”,“sessionId”:“1234”},“viewCount”:0,“sessionCount”:2}
{“_id”:{“assId”:“55f996a4e4b0cc9c0a392593”,“sessionId”:“123”},“viewCount”:0,“sessionCount”:1}
{“_id”:{“assId”:“55f996a4e4b0cc9c0a392593”},“视图计数”:1,“会话计数”:0}
或者使用运算符返回唯一的
sessionId
$unwind
数组,然后重新生成文档

db.collection.aggregate([
{“$match”:{“assetId”:{“$ne”:null}},
{“$group”:{
“_id”:“$assetId”,
“sessionId”:{“$addToSet”:“$sessionId”},
“视图计数”:{
“$sum”:{
“$cond”:[
{“$eq”:[“$action”,“agAsset”]},
1.
0
] 
}
}
}}, 
{“$unwind”:“$sessionId”},
{“$group”:{
“\u id”:“$\u id”,
“viewCount”:{“$first”:“$viewCount”},
“sessionCount”:{“$sum”:1}
}}
])
返回:

{u id:“55f996a4e4b0cc9c0a392593”,“视图计数”:1,“会话计数”:2}

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