按Mongodb中其字段的平均值计算文档

时间:2019-08-11 11:02:25

标签: mongodb aggregation-framework average

我们的学生在4个领域中的得分是这样建模的:

{
    "_id" : xxx,
    "student" : "Private Ryan",
    "math" : 9,
    "history" : 8,
    "literature" : 6,
    "science" : 10  
}

任务是计算有多少good/average/bad个表现良好的学生。鉴于:

  • 良好:average >= 8
  • 不好:拥有average score < 5

如果可能的话,将它们打包也是不错的。

1 个答案:

答案 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" }
        }
    }
])

Mongo Playground