2015-05-09 23 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