MST

星途 面试题库

面试题:MongoDB $unwind在多数组嵌套情况下的拆分策略

给定一个集合employees,每个文档包含一个部门数组departments,每个部门下又包含一个项目数组projects。文档结构类似:{name: '李四', departments: [{deptName: '研发部', projects: ['项目A', '项目B']}, {deptName: '市场部', projects: ['项目C']}]}。请使用聚合框架,通过$unwind阶段实现将所有项目展开,并且返回每个项目所属员工姓名及部门名称的结果集,要求清晰说明$unwind的使用顺序及理由。
26.3万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试
  1. $unwind使用顺序
    • 首先对departments数组进行$unwind
    • 然后对展开后的departments.projects数组进行$unwind
  2. 理由
    • 因为projects数组是嵌套在departments数组中的,要全面展开项目,需要先将外层的departments数组展开,这样才能进一步对每个部门下的projects数组进行展开。如果先对projects数组进行unwind而不先展开departments数组,由于projects数组所在的departments数组未展开,会导致数据结构不满足预期展开需求。
  3. 聚合框架示例代码(以MongoDB为例)
db.employees.aggregate([
    {
        $unwind: "$departments"
    },
    {
        $unwind: "$departments.projects"
    },
    {
        $project: {
            name: 1,
            deptName: "$departments.deptName",
            project: "$departments.projects",
            _id: 0
        }
    }
]);

上述代码中,通过第一个$unwind展开departments数组,第二个$unwind展开departments.projects数组,最后通过$project阶段整理输出结果集,包含员工姓名name、部门名称deptName和项目名称project