フィールドtype、totalA、totalBを含むドキュメントを含むコレクションがあります
タイプごとにグループ化するために集約フレームワークを使用し、totalAとtotalBの両方の合計を取得したいと思います。
私が試した最後のこと(動作しません)は次のとおりです。
'$group' : {
'_id' : '$type',
'totalA' : { '$sum' : '$totalA' },
'totalB' : { '$sum' : '$totalB' },
'totalSum' : { '$sum' : '$totalA', '$sum' : '$totalB' },
} }
totalSumには、結合された値ではなく、フィールドの1つだけの合計があります。
私は解決策を見つけました:
$ projectを使用して、出力に2つのフィールドを一緒に$ addします。
{ "$project" : {
'totalA' : '$totalA',
'totalB' : '$totalB',
'totalSum' : { '$add' : [ '$totalA', '$totalB' ] },
}
$sum
は次のように使用できます。
{
$group : {
_id: null,
amount: { $sum: { $add : [
'$NumberOfItemsShipped', '$NumberOfItemsUnshipped'
]}},
}
},
これに加えて answer ここで、一部のドキュメントにキーが存在しない場合に、$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] }
]
}
},
}
}