MST
星途 面试题库

面试题:MongoDB中not操作符在聚合框架中的深度应用

存在一个employees集合,文档结构如下:{ "employee_id": 1, "name": "Bob", "department": "HR", "salary": 5000, "projects": [ { "project_name": "ProjectA", "start_date": ISODate("2023 - 01 - 01"), "end_date": ISODate("2023 - 06 - 01") }, { "project_name": "ProjectB", "start_date": ISODate("2023 - 07 - 01"), "end_date": ISODate("2023 - 12 - 01") } ] }。使用聚合框架结合not操作符找出在2023年6月1日后没有参与过任何项目且工资高于平均工资的员工,并且说明在实现过程中如何处理not操作符与聚合管道其他阶段的顺序以获得最优性能。
26.2万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

聚合查询实现

  1. 计算平均工资
    var averageSalary = db.employees.aggregate([
        {
            $group: {
                _id: null,
                avgSalary: { $avg: "$salary" }
            }
        }
    ]).next().avgSalary;
    
  2. 找出符合条件的员工
    db.employees.aggregate([
        {
            $match: {
                salary: { $gt: averageSalary },
                projects: {
                    $not: {
                        $elemMatch: {
                            end_date: { $gte: ISODate("2023 - 06 - 01") }
                        }
                    }
                }
            }
        }
    ]);
    

性能优化关于 not 操作符与聚合管道其他阶段顺序

  1. 尽早过滤:在聚合管道中,$match 阶段应该尽量放在前面,因为它可以减少后续阶段需要处理的数据量。在本题中,$match 阶段同时过滤了工资高于平均工资且在指定日期后没有参与项目的员工。对于 not 操作符,将其放在 $match 内部,这样在整个聚合操作开始时就可以快速排除不符合条件的文档。
  2. 利用索引:如果 salaryprojects.end_date 字段上有索引,$match 阶段(包含 not 操作符相关条件)可以利用这些索引进行快速过滤,极大提升性能。确保在进行聚合操作前,相关字段的索引已经建立好。