面试题答案
一键面试假设使用的是 MongoDB 数据库,以下是实现上述需求的聚合管道操作:
db.students.aggregate([
// 左连接 classes 集合,匹配 class_id
{
$lookup: {
from: "classes",
localField: "class_id",
foreignField: "_id",
as: "class_info"
}
},
// 展开 class_info 数组,因为 $lookup 结果是数组
{
$unwind: "$class_info"
},
// 按班级分组,统计每个班级的学生人数
{
$group: {
_id: "$class_info._id",
class_name: { $first: "$class_info.class_name" },
teacher: { $first: "$class_info.teacher" },
student_count: { $sum: 1 }
}
},
// 输出所需字段
{
$project: {
_id: 0,
class_name: 1,
teacher: 1,
student_count: 1
}
}
]);
解释:
$lookup
阶段用于左连接classes
集合,将匹配到的班级信息添加到students
集合的每个文档中。$unwind
阶段展开$lookup
产生的数组,以便后续分组操作。$group
阶段按班级分组,统计每个班级的学生人数,并保留班级名称和老师姓名。$project
阶段输出所需的字段,隐藏_id
字段。
这样的管道操作能够有效减少数据处理量和内存占用,在大数据量下也能有较好的性能表现。