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