我们的学生在4个领域中的得分是这样建模的:
{
"_id" : xxx,
"student" : "Private Ryan",
"math" : 9,
"history" : 8,
"literature" : 6,
"science" : 10
}
任务是计算有多少good/average/bad
个表现良好的学生。鉴于:
average >= 8
分average score < 5
。如果可能的话,将它们打包也是不错的。
答案 0 :(得分:1)
您可以使用$addFields和$let为每个学生定义“标签”。要应用条件逻辑,您可以利用$switch或加倍$cond的优势。然后,您需要运行$group来对它们进行计数,还可以使用$push来获得最终结果中的整个文档:
db.collection.aggregate([
{
$addFields: {
label: {
$let: {
vars: {
avg: {
$divide: [ { $sum: [ "$math", "$history", "$literature", "$science" ] }, 4 ]
}
},
in: {
$cond: [
{ $gte: [ "$$avg", 8 ] },
"good",
{ $cond: [ { $lt: [ "$$avg", 5 ] }, "bad", "average" ] }
]
}
}
}
}
},
{
$group: {
_id: "$label",
count: { $sum: 1 },
students: { $push: "$$ROOT" }
}
}
])