如何在MongoDB聚合框架中提取数组对象值生成独立数组?
如何在MongoDB聚合框架中提取数组对象的值生成独立数组?
需求说明
需要从bloggers集合的文档中,将posts数组内每个对象的platform字段值提取出来,生成一个新的platforms数组字段,同时保留原文档的_id和full_name字段。
示例集合数据
[ { _id: ObjectId(...), posts: [ { "platform": "instagram" }, { "platform": "tiktok" }, ], full_name: "John Doe", }, { _id: ObjectId(...), posts: [ { "platform": "youtube" }, { "platform": "tiktok" }, ], full_name: "Mamed Mamedov" } ]
期望聚合结果
[ { _id: ObjectId(...), platforms: ["instagram", "tiktok"], full_name: "John Doe", }, { _id: ObjectId(...), platforms: ["youtube", "tiktok"], full_name: "Mamed Mamedov" } ]
解决方案
MongoDB提供了直接的语法支持和聚合操作符来实现这个需求,以下是两种常用方法:
方法一:直接投影数组字段属性(最简洁)
利用MongoDB的投影语法,直接通过"$posts.platform"提取数组中所有对象的platform值,自动生成新数组:
db.bloggers.aggregate([ { $project: { full_name: 1, platforms: "$posts.platform" } } ])
- 说明:
$posts.platform会遍历posts数组的每个元素,提取对应的platform值并组合成新数组;full_name: 1表示保留该字段,_id字段默认会被保留,无需额外指定。
方法二:使用$map操作符
通过$map遍历数组元素,手动提取目标字段值:
db.bloggers.aggregate([ { $project: { full_name: 1, platforms: { $map: { input: "$posts", as: "post", in: "$$post.platform" } } } } ])
- 说明:
$map的input指定要遍历的数组,as为数组元素设置别名,in定义对每个元素的操作(这里提取platform值),最终返回处理后的新数组。
两种方法都能实现需求,方法一更简洁高效,推荐优先使用。
内容的提问来源于stack exchange,提问作者Мурад Ахундов
相关产品推荐
相关产品推荐

