MST

星途 面试题库

面试题:MongoDB多集合关联查询中的指定列投影优化

有两个集合,‘students’集合包含学生基本信息{‘student_id’: 1, ‘name’: ‘Bob’, ‘class_id’: 101},‘classes’集合包含班级信息{‘class_id’: 101, ‘class_name’: ‘Math Class’, ‘teacher’: ‘Mr. Smith’}。通过$lookup进行左外连接,查询出所有学生的‘name’、所在班级的‘class_name’,并且要求查询语句在大数据量下有较好的性能,说明如何利用投影操作优化查询性能。
39.1万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

在 MongoDB 中,我们可以使用以下聚合管道来实现通过 $lookup 进行左外连接,并查询出所需信息。同时,利用投影操作优化查询性能。

db.students.aggregate([
    {
        $lookup: {
            from: "classes",
            localField: "class_id",
            foreignField: "class_id",
            as: "class_info"
        }
    },
    {
        $unwind: {
            path: "$class_info",
            preserveNullAndEmptyArrays: true
        }
    },
    {
        $project: {
            name: 1,
            class_name: "$class_info.class_name",
            _id: 0
        }
    }
]);

性能优化说明:

  1. 投影操作($project:在最终的结果投影阶段,只选择需要的字段 nameclass_name,并排除 _id 字段(如果不需要的话)。这样可以减少返回的数据量,从而提高查询性能,特别是在大数据量的情况下。因为网络传输的数据量和处理的数据量都会相应减少。
  2. $unwind 中的 preserveNullAndEmptyArrays:使用 preserveNullAndEmptyArrays 选项可以确保即使没有匹配到班级信息,学生的记录也会保留在结果中,符合左外连接的语义。同时,在大数据量下,这样的设置能保证数据处理的完整性,不会丢失数据。
  3. 索引优化:虽然题目未明确要求,但为了进一步提升性能,在 students 集合的 class_id 字段和 classes 集合的 class_id 字段上创建索引,可以显著加速 $lookup 操作。例如:
db.students.createIndex({class_id: 1});
db.classes.createIndex({class_id: 1});