2015-05-11 4 views
1

У меня есть набор данных выглядитКак присоединиться к двум результатам агрегирования в 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:

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} 

Я не как совместить эти два результата кто может помочь?

ответ

2

Вы можете использовать оператор $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'} 
     } 
    } 
) 

Ouput:

{ 
    "result" : [ 
     { 
      "_id" : "a", 
      "countSession" : 2, 
      "countPOST" : 1 
     }, 
     { 
      "_id" : "b", 
      "countSession" : 1, 
      "countPOST" : 0 
     } 
    ], 
    "ok" : 1 
} 
Смежные вопросы