面试题答案
一键面试聚合查询实现
- 计算平均工资:
var averageSalary = db.employees.aggregate([ { $group: { _id: null, avgSalary: { $avg: "$salary" } } } ]).next().avgSalary;
- 找出符合条件的员工:
db.employees.aggregate([ { $match: { salary: { $gt: averageSalary }, projects: { $not: { $elemMatch: { end_date: { $gte: ISODate("2023 - 06 - 01") } } } } } } ]);
性能优化关于 not
操作符与聚合管道其他阶段顺序
- 尽早过滤:在聚合管道中,
$match
阶段应该尽量放在前面,因为它可以减少后续阶段需要处理的数据量。在本题中,$match
阶段同时过滤了工资高于平均工资且在指定日期后没有参与项目的员工。对于not
操作符,将其放在$match
内部,这样在整个聚合操作开始时就可以快速排除不符合条件的文档。 - 利用索引:如果
salary
和projects.end_date
字段上有索引,$match
阶段(包含not
操作符相关条件)可以利用这些索引进行快速过滤,极大提升性能。确保在进行聚合操作前,相关字段的索引已经建立好。