賛成または反対の投票ができるアイテムのコレクションがあります。
{"_id" : 1, "name": "foo", "upvotes" : 30, "downvotes" : 10}
{"_id" : 2, "name": "bar", "upvotes" : 20, "downvotes" : 0}
{"_id" : 3, "name": "baz", "upvotes" : 0, "downvotes" : 0}
集計を使用して品質を計算したい
db.items.aggregate([
{"$project":
{
"name": "$name",
"upvotes": "$upvotes"
"downvotes": "$downvotes",
"quality": {"$divide":["$upvotes", "$downvotes"]}
}
},
{"$sort": {"quality":-1}}
]);
明らかに、ゼロ除算のため、これは機能しません。適切な条件付けを実装する必要があります。
賛成票!= 0 かつ反対票 == 0 の場合、品質は賛成票 = 賛成票と反対票の両方が 0 の場合、品質は 0 です。
三項演算子を使用して、ダウン投票を 1 ずつ調整してみました。しかし、効果はありませんでした。
db.items.aggregate([
{"$project":
{
"name": "$name",
"upvotes": "$upvotes",
"downvotes": "$downvotes" ? "$downvotes": 1
}
},
{"$project":
{
"name": "$name",
"upvotes": "$upvotes"
"downvotes": "$downvotes",
"quality": {"$divide":["$upvotes", "$downvotes"]}
}
},
{"$sort": {"quality":-1}}
]);
この種の条件付けを MongoDB 集約フレームワーク内に統合するにはどうすればよいでしょうか?
ベストアンサー1
使用したい場合があります$条件これを処理する演算子:
db.items.aggregate([
{"$project":
{
"name": "$name",
"upvotes": "$upvotes",
"downvotes": "$downvotes",
"quality": { $cond: [ { $eq: [ "$downvotes", 0 ] }, "N/A", {"$divide":["$upvotes", "$downvotes"]} ] }
}
},
{"$sort": {"quality":-1}}
]);