MongoDB统计各个专业的最高成绩的学生姓名和成绩
时间: 2023-12-17 21:02:38 浏览: 52
假设有一个名为`students`的集合,包含以下文档结构:
```
{
"_id": ObjectId("5f3f3a27d7e9ca0011c3d3f0"),
"name": "张三",
"major": "计算机科学与技术",
"scores": [
{ "subject": "数学", "score": 85 },
{ "subject": "英语", "score": 88 },
{ "subject": "计算机基础", "score": 90 }
]
}
```
可以使用以下聚合管道查询得到各个专业的最高成绩的学生姓名和成绩:
```
db.students.aggregate([
// 展开scores数组
{ $unwind: "$scores" },
// 按专业分组,计算最高成绩
{
$group: {
_id: "$major",
maxScore: { $max: "$scores.score" }
}
},
// 加入最高成绩对应的学生姓名
{
$lookup: {
from: "students",
let: { major: "$_id", maxScore: "$maxScore" },
pipeline: [
{ $match: { $expr: { $eq: [ "$major", "$$major" ] } } },
{ $unwind: "$scores" },
{ $match: { $expr: { $eq: [ "$scores.score", "$$maxScore" ] } } },
{ $project: { _id: 0, name: 1 } }
],
as: "topStudent"
}
},
// 输出结果
{ $project: { _id: 0, major: "$_id", topStudent: { $arrayElemAt: [ "$topStudent.name", 0 ] }, maxScore: 1 } }
])
```
该聚合管道的具体作用如下:
1. 使用`$unwind`操作展开`scores`数组,以便能够按成绩进行统计。
2. 使用`$group`操作按专业分组,并计算每个专业的最高成绩。
3. 使用`$lookup`操作将最高成绩对应的学生姓名查询出来。
4. 使用`$project`操作输出结果,包括专业、最高成绩、以及最高成绩对应的学生姓名。
阅读全文