MST

星途 面试题库

面试题:MongoDB管道操作之嵌套与多阶段优化

有两个集合,'students' 包含学生基本信息,字段有 '_id'、'name'、'class_id';'classes' 包含班级信息,字段有 '_id'、'class_name'、'teacher'。请通过管道操作,查询出每个班级的学生人数,同时显示班级名称和老师姓名,要求尽量优化管道操作,减少数据处理量和内存占用,并且要考虑大数据量下的性能问题。
48.7万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

假设使用的是 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
        }
    }
]);

解释:

  1. $lookup 阶段用于左连接 classes 集合,将匹配到的班级信息添加到 students 集合的每个文档中。
  2. $unwind 阶段展开 $lookup 产生的数组,以便后续分组操作。
  3. $group 阶段按班级分组,统计每个班级的学生人数,并保留班级名称和老师姓名。
  4. $project 阶段输出所需的字段,隐藏 _id 字段。

这样的管道操作能够有效减少数据处理量和内存占用,在大数据量下也能有较好的性能表现。