2016-05-04 2 views
2

MongoDB Collection -Как группировать по нескольким столбцам и несколько значений в MongoDB

[ 
{ name: 'name 1', call: 'Success Call' }, 
{ name: 'name 1', call: 'Repeat Call' }, 
{ name: 'name 3', call: 'Repeat Call' }, 
{ name: 'name 3', call: 'Unsuccess Call' } 
{ name: 'name 2', call: 'Success Call' }, 
{ name: 'name 2', call: 'Repeat Call' } 
{ name: 'name 2', call: 'Repeat Call' } 
{ name: 'name 2', call: 'Unsuccess Call' } 
. 
. 
. 
. 
] 

я следовал этой ссылке group and sum multiple columns using aggregation framework и в конечном итоге с этим выходом.

[ 
{ 
    "_id": 1, 
    "Calls": [ 
     { 
      "call": "Repeat Call", 
      "callCount": 2 
     }, 
     { 
      "call": "Unsuccess Call", 
      "callCount": 1 
     }, 
     { 
      "call": "Success Call", 
      "callCount": 1 
     } 
    ], 
    "Names": [ 
     { 
      "name": { 
       "name": "name 4" 
      }, 
      "nameCount": 1 
     }, 
     { 
      "name": { 
       "name": "name 3" 
      }, 
      "nameCount": 1 
     }, 
     { 
      "name": { 
       "name": "name 1" 
      }, 
      "nameCount": 2 
     } 
    ] 
} 
] 

В то время как я на самом деле нужно что-то вроде этого

[ 
{ 
    "name": "name 4", 
    "nameCount": 1, 
    "Success Call":1, 
    "Unsuccess Call":0, 
    "Repeat Call":0 
}, 
{ 
    "name": "name 3", 
    "nameCount": 1, 
    "Success Call":2, 
    "Unsuccess Call":3, 
    "Repeat Call":1 
}, 
{ 
    "name": "name 1", 
    "nameCount": 2, 
    "Success Call":1, 
    "Unsuccess Call":1, 
    "Repeat Call":1 
} 
] 

Может кто-нибудь помочь мне сортировать это? Спасибо заранее!

ответ

4

В трубопроводе aggregattion, воспользоваться оператором $cond в $group этапе оценить счетчики на основе значения call, что-то вроде следующего:

db.collection.aggregate([ 
    { 
     "$group": { 
      "_id": "$name", 
      "nameCount": { "$sum": 1 }, 
      "Success Call": { 
       "$sum": { 
        "$cond": [ { "$eq": [ "$call", "Success Call" ] }, 1, 0] 
       } 
      }, 
      "Repeat Call": { 
       "$sum": { 
        "$cond": [ { "$eq": [ "$call", "Repeat Call" ] }, 1, 0] 
       } 
      }, 
      "Unsuccess Call": { 
       "$sum": { 
        "$cond": [ { "$eq": [ "$call", "Unsuccess Call" ] }, 1, 0] 
       } 
      } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "name": "$_id", 
      "nameCount": 1, 
      "Success Call":1, 
      "Unsuccess Call":1, 
      "Repeat Call":1    
     } 
    } 
]) 
+1

Серьезно WOW !!! Это работало безупречно. Ты гениальный брат. Я чувствую, что я нахожусь на девятом облаке, просто из вас. Пожалуйста, скажите мне место, где я могу следовать за вами лично :) –

+0

Как я могу сделать что-то подобное, если я не знаю (не могу указать hardcode) значения для вызова: поле? –

Смежные вопросы