Агрегировать и суммировать по одному ключу и отдыхать - PullRequest
0 голосов
/ 20 февраля 2020

Мне сложно объяснить, что я хочу получить, поэтому я покажу пример:

У меня есть объекты:

{name: 'steve', received: 100} {name: 'carolina', received: 70} 
{name: 'steve', 'received: 30} {name: 'andrew', received: 10}

Я могу сделать:

    { $group :
         { _id : '$name',
           sum : { "$sum" :'$received' }, 
         },                          
    },

И я получу:

Стив получил 130 (100 +30)

Каролина получила 70

Эндрю получил 10

Но Мне нужно что-то подобное:

Стив получил 130 (100 +30)

Все остальные получили 80 ( 70 + 10)

Как мне получить этот эффект?

1 Ответ

1 голос
/ 20 февраля 2020

Вы можете указать условие с помощью оператора аккумулятора $sum в группировке:

db.test.aggregate( [
  { 
      $group : { 
          _id :  null, 
          steve_received: { 
              $sum: {
                  $cond: [ { $eq: [ "$name", "steve" ] }, "$received", 0 ]
              } 
          },
          others_received: { 
              $sum: {
                  $cond: [ { $ne: [ "$name", "steve" ] }, "$received", 0 ]
              } 
          }
      } 
  },
  {
      $project: { _id: 0 }
  }
] )

Приведенная выше агрегация возвращает: { "steve_received" : 130, "others_received" : 80 }

...