如何在MongoDB中加入两个聚合结果?

时间:2015-05-11 18:37:24

标签: 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写了聚合计数不同的会话ID:

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

查询的预期结果是:

{ "_id" : "a", "countSession" : 2 }
{ "_id" : "b", "countSession" : 1 }

另一个问题是按品牌计算方法的POST位置:

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

预期结果:

{ "_id" : "a", "countPOST" : 1 }
{ "_id" : "b", "countSession" : 0 }

现在,我希望将这两个查询结合起来,得到如下预期结果:

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

我不知道如何将这两个聚合的结果结合起来,任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

您可以按如下方式使用$cond运算符。

db.Collection.aggregate(
    {
        '$group': {
            '_id': {'BrandId':'$BrandId','Session': '$SessionId'},
            'countPOST':{
                '$sum':{ 
                    '$cond': [{'$eq':['$Method','POST']},1,0]
                }
            }
        }
    },
    {
        '$group': {
            '_id': '$_id.BrandId',
            'countSession': {'$sum':1},
            'countPOST': {'$sum': '$countPOST'}
        }
    }
)

输出继电器:

{
    "result" : [ 
        {
            "_id" : "a",
            "countSession" : 2,
            "countPOST" : 1
        }, 
        {
            "_id" : "b",
            "countSession" : 1,
            "countPOST" : 0
        }
    ],
    "ok" : 1
}