バージョン3.4から、ステージ$switch
で論理条件処理を可能にする演算子を使用できるようになりました。$group
もちろん$sum
、合計を返すにはアキュムレータを使用する必要があります。
db.Sentiments.aggregate(
[
{ "$group": {
"_id": "$Company",
"SumPosSenti": {
"$sum": {
"$switch": {
"branches": [
{
"case": { "$gt": [ "$Sentiment", 0 ] },
"then": "$Sentiment"
}
],
"default": 0
}
}
},
"SumNegSenti": {
"$sum": {
"$switch": {
"branches": [
{
"case": { "$lt": [ "$Sentiment", 0 ] },
"then": "$Sentiment"
}
],
"default": 0
}
}
}
}}
]
)
mongod
3.4以降にまだ移行していない場合は、演算子が数値を返すため、この回答$project
の段階が冗長であることに注意してください。これは、ドキュメントを作成して式に適用できることを意味します。$cond
$group
$sum
$cond
これにより、特に大規模なコレクションの場合、アプリケーションのパフォーマンスが向上します。
db.Sentiments.aggregate(
[
{ '$group': {
'_id': '$Company',
'PosSentiment': {
'$sum': {
'$cond': [
{ '$gt': ['$Sentiment', 0]},
'$Sentiment',
0
]
}
},
'NegSentiment': {
'$sum': {
'$cond': [
{ '$lt': ['$Sentiment', 0]},
'$Sentiment',
0
]
}
}
}}
]
)
次のドキュメントを含むコレクションSentimentsについて考えてみます。
{ "Company": "a", "Sentiment" : 2 }
{ "Company": "a", "Sentiment" : 3 }
{ "Company": "a", "Sentiment" : -1 }
{ "Company": "a", "Sentiment" : -5 }
集計クエリは以下を生成します。
{ "_id" : "a", "SumPosSenti" : 5, "SumNegSenti" : -6 }