2015-05-09 27 views
0

選擇結果用不同的過濾器我有一個數據集看起來如何都與MongoDB的

{"BrandId":"a","SessionId":100,"Method": "POST"} 
{"BrandId":"a","SessionId":200,"Method": "PUT"} 
{"BrandId":"a","SessionId":200,"Method": "GET"} 
{"BrandId":"b","SessionId":300,"Method": "GET"} 

我想通過brandid計數不同的sessionid組和計數,其中方法是POST組由brandid。對於我所提到的例子中,預期的結果是:

{"BrandId:"a","countSession":2,"countPOST":1} 
{"BrandId:"b","countSession":1,"countPOST":0} 

我知道如果我想指望通過brandid不同seesionid,代碼如下:

db.collection.aggregate([ 
{$group: { 
      "_id": { 
       brand: "$BrandId", 
       session: "$SessionId" 
      }, 
      count: {$sum: 1} 
    }}, 
    {$group: { 
      _id: "$_id.brand", 
      countSession:{$sum:1} 
    }} 
]) 

如果我們只需要計算後代碼如下:

db.collection.aggregate([ 
    {$match: {Method:"POST"}}, 
    {$group: { 
     _id: '$BrandId', 
     countPOST:{$sum:1} 
    }} 
]) 

但我不把這兩個代碼結合在一起,並且結果與我剛纔提到的預期結果相同?任何人都可以幫忙

回答

0

你需要在你的第一個$group級遞增的POST對不同SessionIdBrandId的號碼,然後在你的第二個$group階段不同SessionId$sumPOST由數BrandId

db.collections.aggregate(
    [ 
     { '$match': {'Method': 'POST' }}, 
     { '$group': { 
         '_id': { 
            'brand': '$BrandId', 
            'session': '$SessionId' 
        }, 
         'countPost': { '$sum': 1 } 
     } 
        }, 
     { '$group': { 
         '_id': '$_id.brand', 
         'countSession': { '$sum': 1 }, 
         'countPost': { '$sum': '$countPost' } 
        } 
     }, 
     { '$project': { 
          'BrandId': '$_id', 
          'countPost': 1, 
          'countSession': 1, 
          '_id': 0 
         } 
     } 
    ] 
) 

輸出:

{ "countSession" : 1, "countPost" : 1, "BrandId" : "b" } 
{ "countSession" : 2, "countPost" : 3, "BrandId" : "a" } 
+0

嗨,如果你使用我在問題中提到的相同的示例數據,你可以結果與預期結果不符。 – erkpwejropi

+0

代碼不正確,因爲它僅使用POST過濾數據。有一些品牌沒有POST,我仍然需要數這個品牌。我需要結合不同過濾器的數據。這是我遇到問題的地方。 – erkpwejropi

+0

@erkpwejropi在你的帖子中,你說*通過brandid統計不同的SessionId組,並計算方法是POST * – styvane