2015-05-09 2 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"} 

Я хотел бы рассчитывать отчетливую SESSIONID группы по brandid и сосчитать, где метод POST группы по brandid. Для примера, я упомянул, ожидаемый результат:

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

Я знаю, хочу ли я рассчитывать отчетливый seesionid по brandid, код выглядит следующим образом:

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 для отдельного SessionId и BrandId затем в вашем втором $group этапе подсчет отчетливый 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 
         } 
     } 
    ] 
) 

Выход:

{ "countSession" : 1, "countPost" : 1, "BrandId" : "b" } 
{ "countSession" : 2, "countPost" : 3, "BrandId" : "a" } 
+0

Привет, Если вы используете те же примеры данных, о которых я упоминал в вопросе, вы можете ee результат не соответствует ожидаемому результату. – erkpwejropi

+0

Неверный код, потому что он фильтрует данные только с помощью POST. Существует какой-то Бренд с POST вообще, и мне все равно нужно считать этот бренд. Мне нужно комбинировать данные разных фильтров. И здесь я встречаю проблему. – erkpwejropi

+0

@erkpwejropi В вашем сообщении вы сказали * подсчитать отдельную группу SessionId фирмой и подсчитать, где метод POST * – styvane