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)自动排除 } } ])
阶段说明
- $unwind阶段:将
parentDetails数组拆分为多个文档,每个文档包含原学生信息和数组中的一个家长对象,此时每条文档对应一位家长。 - $project阶段:
- 指定保留学生的核心字段:
studentId、studentName、grade - 从拆分后的
parentDetails对象中提取name、email、relation,并分别重命名为parentName、parentEmail、relation - 通过
_id: 0排除原文档的_id字段,同时自动排除未指定的字段(如gender、家长的_id和mobile)
- 指定保留学生的核心字段:
执行上述聚合查询后,即可得到符合预期的拆分结果。
内容的提问来源于stack exchange,提问作者Code The World
相关产品推荐
相关产品推荐

