MST

星途 面试题库

面试题:MongoDB复杂内嵌文档的高级查询与设计

有一个集合叫employees,每个员工文档包含个人信息(姓名、性别、部门),同时有一个内嵌文档叫projects,该内嵌文档是一个数组,每个数组元素是一个项目,包含项目名称、开始时间、结束时间和项目状态。要求设计文档结构以方便查询:找出在‘研发部’且参与过至少一个已完成项目(项目状态为‘completed’)的员工信息,并按照员工参与的已完成项目数量降序排列。
30.1万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

在MongoDB中,可以这样设计文档结构:

{
    "name": "员工姓名",
    "gender": "性别",
    "department": "研发部",
    "projects": [
        {
            "projectName": "项目名称1",
            "startTime": "开始时间1",
            "endTime": "结束时间1",
            "status": "completed"
        },
        {
            "projectName": "项目名称2",
            "startTime": "开始时间2",
            "endTime": "结束时间2",
            "status": "inprogress"
        }
    ]
}

查询语句如下:

db.employees.aggregate([
    {
        $match: {
            department: "研发部",
            "projects.status": "completed"
        }
    },
    {
        $addFields: {
            completedProjectsCount: {
                $size: {
                    $filter: {
                        input: "$projects",
                        as: "project",
                        cond: { $eq: ["$$project.status", "completed"] }
                    }
                }
            }
        }
    },
    {
        $sort: {
            completedProjectsCount: -1
        }
    }
]);
  1. $match阶段:筛选出部门为“研发部”且至少有一个项目状态为“completed”的员工文档。
  2. $addFields阶段:使用$filter操作符和$size操作符计算每个员工参与的已完成项目数量,并将其添加为新字段completedProjectsCount
  3. $sort阶段:按照completedProjectsCount字段降序排列,返回结果。