如何使用MongoDB选择具有不同过滤器的结果

时间:2015-05-09 01:42:22

标签: mongodb aggregation-framework

我的数据集看起来像

{"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组,并计算方法是由brandid进行POST组的方法。对于我提到的例子,预期的结果是:

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

我知道如果我想用brandid计算不同的seeionid,代码如下:

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

但是我没有将这两个代码组合在一起,并且结果与我之前提到的预期结果相同?有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

在第一个$group阶段,您需要计算POST SessionIdBrandId的数量,然后在第二个$group阶段计数{ {1}}和SessionId$sum POST

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