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

erk*_*opi 3 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"}
Run Code Online (Sandbox Code Playgroud)

我通过brandid写了聚合计数不同的会话ID:

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

该查询的预期结果是:

{ "_id" : "a", "countSession" : 2 }
{ "_id" : "b", "countSession" : 1 }
Run Code Online (Sandbox Code Playgroud)

另一个查询是按品牌计数方法在POST的位置:

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

预期结果:

{ "_id" : "a", "countPOST" : 1 }
{ "_id" : "b", "countSession" : 0 }
Run Code Online (Sandbox Code Playgroud)

现在,我想结合这两个查询并获得预期的结果,如下所示:

{"BrandId:"a","countSession":2,"countPOST":1}
{"BrandId:"b","countSession":1,"countPOST":0}
Run Code Online (Sandbox Code Playgroud)

我不怎么将两个聚合的这两个结果结合起来,谁能帮忙?

the*_*gre 5

您可以$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'}
        }
    }
)
Run Code Online (Sandbox Code Playgroud)

输出:

{
    "result" : [ 
        {
            "_id" : "a",
            "countSession" : 2,
            "countPOST" : 1
        }, 
        {
            "_id" : "b",
            "countSession" : 1,
            "countPOST" : 0
        }
    ],
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)