我们学生在 4 个领域的分数是这样建模的:
{
"_id" : xxx,
"student" : "Private Ryan",
"math" : 9,
"history" : 8,
"literature" : 6,
"science" : 10
}
任务是计算有多少good/average/bad
表演的学生。鉴于:
- 好:有
average >= 8
点 - 不好:有
average score < 5
。
如果可能的话,把它们桶起来也会很好。
您可以使用$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" }
}
}
])
蒙戈游乐场