web-dev-qa-db-ja.com

Aggregationフレームワークを使用してMongoDBの2つのフィールドを合計することは可能ですか?

フィールドtype、totalA、totalBを含むドキュメントを含むコレクションがあります

タイプごとにグループ化するために集約フレームワークを使用し、totalAとtotalBの両方の合計を取得したいと思います。

私が試した最後のこと(動作しません)は次のとおりです。

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

totalSumには、結合された値ではなく、フィールドの1つだけの合計があります。

15
Roy Reznik

私は解決策を見つけました:

$ projectを使用して、出力に2つのフィールドを一緒に$ addします。

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

$sumは次のように使用できます。

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

これに加えて answer ここで、一部のドキュメントにキーが存在しない場合に、$addが間違った値を与える問題を追加します。

たとえば、Col3Col4キーがnot present/ undefinedである場合は、$ifNullの下が役立ちます。

{
 $group : {
  _id: {
     "Col1": "$Col1",
     "Col2": "$Col2"
    },
  sum_of_all_days_in_year: {
    $sum: {
      "$add": [
        { "$ifNull": ["$Col3", 0] },
        { "$ifNull": ["$Col4", 0] }
       ]
     }
  },
 }
}