You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB基于对象数组投影学生与对应家长关联数据的实现咨询

MongoDB学生-家长数据拆分方案

需求说明

现有单条MongoDB文档包含学生基本信息及多位家长的详情数组,需要将其转换为每个家长对应一条关联学生信息的独立文档,实现一对多的数据拆分投影。

原始数据

{
  _id: ObjectId('643f8a6773a92fb1552e4c89'),
  studentName: 'Peter Jackson',
  studentId: 'SID1001',
  grade: 2,
  gender: 'Male',
  parentDetails: [
    {
        _id: ObjectId('63fee5a42f60946679146768'),
        name: 'Jackson Steve',
        email: 'jack.steve@gmail.com',
        mobile: 'xxxxxxxxxx',
        relation: 'Father'
    },
    {
        _id: ObjectId('6447c1ba22670472ed4b29cc'),
        name: 'Amenda Jackson',
        email: 'amenda.jack@gmail.com',
        mobile: 'xxxxxxxxxx',
        relation: 'Mother'
    }
  ]
}

预期输出

[
  {
    studentId: 'SID1001',
    studentName: 'Peter Jackson',
    grade: 2,
    parentName: 'Jackson Steve',
    parentEmail: 'jack.steve@gmail.com',
    relation: 'Father'
  },
  {
    studentId: 'SID1001',
    studentName: 'Peter Jackson',
    grade: 2,
    parentName: 'Amenda Jackson',
    parentEmail: 'amenda.jack@gmail.com',
    relation: 'Mother'
  }
]

实现方案

使用MongoDB聚合管道的$unwind和$project阶段完成转换,具体聚合查询如下:

db.students.aggregate([
  // 拆分家长数组,每个家长生成独立文档
  { $unwind: "$parentDetails" },
  // 投影并重命名字段,保留需要的信息
  {
    $project: {
      _id: 0, // 排除原文档_id
      studentId: 1,
      studentName: 1,
      grade: 1,
      parentName: "$parentDetails.name",
      parentEmail: "$parentDetails.email",
      relation: "$parentDetails.relation"
      // 不需要的字段(如gender、parentDetails._id、mobile)自动排除
    }
  }
])

阶段说明

  1. $unwind阶段:将parentDetails数组拆分为多个文档,每个文档包含原学生信息和数组中的一个家长对象,此时每条文档对应一位家长。
  2. $project阶段:
    • 指定保留学生的核心字段:studentId、studentName、grade
    • 从拆分后的parentDetails对象中提取name、email、relation,并分别重命名为parentName、parentEmail、relation
    • 通过_id: 0排除原文档的_id字段,同时自动排除未指定的字段(如gender、家长的_id和mobile)

执行上述聚合查询后,即可得到符合预期的拆分结果。

内容的提问来源于stack exchange,提问作者Code The World

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:44:54