あなたはとても親密でしたが、もちろん$eq
true/false
を返すだけです 値なので、その数値を作成するには$cond
が必要です。 :
db.collection(collectionName).aggregate([
{ "$group" : {
"_id": "$item",
"good_count": {
"$sum": {
"$cond": [ { "$eq": [ "$rating", "good" ] }, 1, 0]
}
},
"neutral_count":{
"$sum": {
"$cond": [ { "$eq": [ "$rating", "neutral" ] }, 1, 0 ]
}
},
"bad_count": {
"$sum": {
"$cond": [ { "$eq": [ "$rating", "bad" ] }, 1, 0 ]
}
}
}}
])
「三項」演算子として$cond
最初の引数(if)として論理条件を取り、評価がtrue
である2番目の引数を返します。 (その後)またはfalse
の3番目の引数 (そうしないと)。これにより、true/false
1
に戻ります および0
$sum
にフィードする それぞれ。
また、「case」は$eq
の影響を受けやすいことに注意してください 。さまざまなケースがある場合は、$toLower
が必要になる可能性があります 式の中で:
"$cond": [ { "$eq": [ { "$toLower": "$rating" }, "bad" ] }, 1, 0 ]
少し異なる点として、次の集計は通常、さまざまな可能な値に対してより柔軟であり、パフォーマンスの観点から条件付き合計の周りでリングを実行します。
db.collection(collectionName).aggregate([
{ "$group": {
"_id": {
"item": "$item",
"rating": { "$toLower": "$rating" }
},
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.item",
"results": {
"$push": {
"rating": "$_id.rating",
"count": "$count"
}
}
}}
])
代わりに、次のような出力が得られます:
{
"_id": "item_1"
"results":[
{ "rating": "good", "count": 12 },
{ "rating": "neutral", "count": 10 }
{ "rating": "bad", "count": 67 }
]
}
これはすべて同じ情報ですが、値を明示的に一致させる必要はなく、この方法ではるかに高速に実行されます。