2015-10-19 70 views
1

我使用以下示例数据进行分析收集。MongoDB聚合组由不同列的总和组成

{ "_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”找到分析组的总和,然后查找每个“action”类型。我想出了下面的查询

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 ] 
       } 
      } 
     } 
    }] 
    ) 

这除了事实,我找不到“sessionCount”使用不同的“会话ID”的伟大工程。例如,下面是电流输出

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

预期的输出是

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

我需要找到sessionCount为action='mobCmd'和具有sessionIddistinct值。如何使用'sessionCount'部分中的$ sum操作的不同内部?

+0

什么是你想在这里做什么?目前还不清楚你在问什么。你当前的查询输出是什么?预期的结果是什么? – styvane

+0

@ user3100115我刚刚更新了当前和预期输出的帖子。感谢您的检查。如果信息不足,请发表评论 –

回答

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数组的数组然后重新您的文档。

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 }