MST

星途 面试题库

面试题:MongoDB子管道操作在复杂数据结构处理中的应用

给定一个集合 'employees',每个文档包含 'employee_id'、'name' 以及一个 'projects' 数组,'projects' 数组中的每个元素是一个对象,包含 'project_name'、'start_date' 和 'end_date'。现在要使用聚合框架的子管道操作,找出参与了至少3个项目,并且这些项目平均持续时间超过90天的员工信息。请写出完整的聚合操作。
49.0万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试
db.employees.aggregate([
    {
        $unwind: "$projects"
    },
    {
        $group: {
            _id: "$employee_id",
            name: { $first: "$name" },
            projectCount: { $sum: 1 },
            totalDuration: { $sum: { $subtract: ["$projects.end_date", "$projects.start_date"] } }
        }
    },
    {
        $match: {
            projectCount: { $gte: 3 },
            averageDuration: { $gt: 90 }
        }
    },
    {
        $addFields: {
            averageDuration: { $divide: ["$totalDuration", "$projectCount"] }
        }
    },
    {
        $project: {
            _id: 0,
            employee_id: "$_id",
            name: 1,
            projectCount: 1,
            averageDuration: 1
        }
    }
]);

以上代码以 MongoDB 为例进行聚合操作:

  1. $unwind 展开 projects 数组,以便后续对每个项目进行操作。
  2. $groupemployee_id 分组,统计每个员工参与项目的数量 projectCount 以及所有项目总持续时间 totalDuration
  3. $addFields 计算平均项目持续时间 averageDuration
  4. $match 筛选出参与至少3个项目且平均持续时间超过90天的员工。
  5. $project 输出需要的字段,隐藏 _id 字段,显示 employee_idnameprojectCountaverageDuration

请注意,实际代码可能需要根据你使用的数据库及具体数据情况进行调整。