Можно ли суммировать 2 поля в MongoDB, используя структуру агрегации?

У меня есть коллекция с документами, которые содержат тип полей, totalA и totalB

Я хочу использовать структуру агрегации, чтобы сгруппировать по типу и получить сумму как totalA, так и totalB вместе.

Последнее, что я пробовал (не работает):

'$group' : { 
  '_id' : '$type', 
  'totalA' : { '$sum' : '$totalA' },
  'totalB' : { '$sum' : '$totalB' },
  'totalSum' : { '$sum' : '$totalA', '$sum' : '$totalB' },
}  }

totalSum имеет сумму только одного из полей вместо комбинированного значения.


person Roy Reznik    schedule 21.05.2013    source источник


Ответы (3)


Я нашел решение:

Просто используйте $project, чтобы $ добавить два поля вместе на выходе.

{ "$project" : {
      'totalA' : '$totalA',
      'totalB' : '$totalB',
      'totalSum' : { '$add' : [ '$totalA', '$totalB' ] },
     }
person Roy Reznik    schedule 21.05.2013

Вы можете использовать $sum таким образом:

{
    $group : {
        _id: null,
        amount: { $sum: { $add : [ 
            '$NumberOfItemsShipped', '$NumberOfItemsUnshipped' 
        ]}},
    }
},
person Dobrea Petrisor    schedule 17.02.2018

В дополнение к этому ответу здесь добавьте проблему с $add, дающей неправильные значения, когда ключи отсутствуют в некоторых документах.

Если, например, клавиши Col3 и Col4 иногда бывают not present/ undefined, то ниже $ifNull поможет:

{
 $group : {
  _id: {
     "Col1": "$Col1",
     "Col2": "$Col2"
    },
  sum_of_all_days_in_year: {
    $sum: {
      "$add": [
        { "$ifNull": ["$Col3", 0] },
        { "$ifNull": ["$Col4", 0] }
       ]
     }
  },
 }
}
person Manohar Reddy Poreddy    schedule 21.08.2018