Mongodbの私のコレクションは、SQLの次の表に似ています。
センチメント(会社、センチメント)
次に、次のようなクエリを実行する必要があります。
SELECT
Company,
SUM(CASE WHEN Sentiment >0 THEN Sentiment ELSE 0 END) AS SumPosSenti,
SUM(CASE WHEN Sentiment <0 THEN Sentiment ELSE 0 END) AS SumNegSenti
FROM Sentiments
GROUP BY Company
Mongoでこのクエリを作成するにはどうすればよいですか?私は次のクエリで立ち往生しています:
db.Sentiments.aggregate(
{ $project: {_id:0, Company:1, Sentiment: 1} },
{ $group: {_id: "$Company", SumPosSenti: {$sum: ? }, SumNegSenti: {$sum: ? } } }
);
Sammayeが示唆したように、これを行うには$cond
集約射影演算子を使用する必要があります。
db.Sentiments.aggregate(
{ $project: {
_id: 0,
Company: 1,
PosSentiment: {$cond: [{$gt: ['$Sentiment', 0]}, '$Sentiment', 0]},
NegSentiment: {$cond: [{$lt: ['$Sentiment', 0]}, '$Sentiment', 0]}
}},
{ $group: {
_id: "$Company",
SumPosSentiment: {$sum: '$PosSentiment'},
SumNegSentiment: {$sum: '$NegSentiment'}
}});
バージョン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
この段階 answer は、 $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
]
}
}
}}
]
)
次のドキュメントを含むコレクションのセンチメントを検討してください。
{ "Company": "a", "Sentiment" : 2 }
{ "Company": "a", "Sentiment" : 3 }
{ "Company": "a", "Sentiment" : -1 }
{ "Company": "a", "Sentiment" : -5 }
集計クエリは以下を生成します。
{ "_id" : "a", "SumPosSenti" : 5, "SumNegSenti" : -6 }
配列構文を使用する上記のスニペットの説明:
PosSentiment: {$cond: [{$gt: ['$Sentiment', 0]}, '$Sentiment', 0]}
等しい:
PosSentiment: {$cond: { if: {$gt: ['$Sentiment', 0]}, then: '$Sentiment', else: 0} }
配列構文は、長い構文を単に{ $cond: [if, then, else] }