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

如何在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,提问作者Мурад Ахундов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:43:16