MongoDB中数组类型怎么操作?附详细代码示例

来源:站长站作者:越南程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《MongoDB中数组类型怎么操作?附详细代码示例》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《MongoDB中数组类型怎么操作?附详细代码示例》有用,将其分享出去将是对创作者最好的鼓励。

MongoDB的文档模型支持数组类型字段,能够灵活存储多个同类型或不同类型的元素,在实际业务中常用于存储标签、评论列表、关联ID集合等场景,掌握数组的操作方法是MongoDB开发的基础能力。

MongoDB中数组类型怎么操作?附详细代码示例

数组字段的基础创建

在插入文档时,可以直接将字段设置为数组形式,数组元素可以是任意合法的数据类型,包括字符串、数字、对象甚至嵌套数组。

// 插入包含数组字段的文档
db.users.insertOne({
  name: "张三",
  age: 25,
  tags: ["前端", "JavaScript", "Vue"], // 字符串数组
  scores: [90, 85, 92], // 数字数组
  address: [ // 嵌套对象数组
    { city: "北京", area: "海淀区" },
    { city: "上海", area: "浦东新区" }
  ]
})

数组的添加元素操作

MongoDB提供了多种向数组中添加元素的方法,常用的包括$push$addToSet等更新操作符。

使用$push添加元素

$push可以向数组末尾添加一个或多个元素,允许重复元素存在。

// 向tags数组添加一个元素
db.users.updateOne(
  { name: "张三" },
  { $push: { tags: "React" } }
)

// 向tags数组添加多个元素,需要使用$each修饰符
db.users.updateOne(
  { name: "张三" },
  { $push: { tags: { $each: ["Node.js", "MongoDB"] } } }
)

使用$addToSet添加元素

$addToSet只会向数组中添加不存在的元素,避免重复值。

// 添加已存在的元素,数组不会变化
db.users.updateOne(
  { name: "张三" },
  { $addToSet: { tags: "JavaScript" } }
)

// 添加不存在的元素
db.users.updateOne(
  { name: "张三" },
  { $addToSet: { tags: "TypeScript" } }
)

数组的删除元素操作

删除数组元素常用的操作符有$pop$pull$pullAll

使用$pop删除首尾元素

$pop通过值控制删除方向,1表示删除数组最后一个元素,-1表示删除第一个元素。

// 删除tags数组最后一个元素
db.users.updateOne(
  { name: "张三" },
  { $pop: { tags: 1 } }
)

// 删除tags数组第一个元素
db.users.updateOne(
  { name: "张三" },
  { $pop: { tags: -1 } }
)

使用$pull删除指定元素

$pull可以删除数组中满足条件的所有元素,支持条件匹配。

// 删除tags数组中值为"Vue"的元素
db.users.updateOne(
  { name: "张三" },
  { $pull: { tags: "Vue" } }
)

// 删除scores数组中大于90的元素
db.users.updateOne(
  { name: "张三" },
  { $pull: { scores: { $gt: 90 } } }
)

使用$pullAll删除多个指定元素

$pullAll可以一次性删除数组中多个指定的元素。

// 删除tags数组中的"React"和"Node.js"
db.users.updateOne(
  { name: "张三" },
  { $pullAll: { tags: ["React", "Node.js"] } }
)

数组的修改元素操作

修改数组中的指定元素可以使用下标定位或者$[]$[<identifier>]等数组过滤操作符。

通过下标修改元素

MongoDB数组的下标从0开始,可以直接通过下标定位要修改的元素。

// 修改tags数组第一个元素
db.users.updateOne(
  { name: "张三" },
  { $set: { "tags.0": "前端开发" } }
)

使用$[]修改所有元素

$[]可以匹配数组中的所有元素,对符合条件的文档的数组所有元素进行修改。

// 给scores数组所有元素加5分
db.users.updateOne(
  { name: "张三" },
  { $inc: { "scores.$[]": 5 } }
)

使用$[<identifier>]按条件修改元素

结合arrayFilters可以只修改数组中满足条件的元素。

// 只给scores数组中小于90的元素加10分
db.users.updateOne(
  { name: "张三" },
  { $inc: { "scores.$[score]": 10 } },
  { arrayFilters: [{ "score": { $lt: 90 } }] }
)

数组的查询操作

查询数组字段时,可以根据元素值、元素位置、数组长度等条件进行匹配。

匹配数组中的元素

直接指定元素值可以匹配数组中包含该元素的文档。

// 查询tags数组包含"JavaScript"的文档
db.users.find({ tags: "JavaScript" })

// 查询tags数组同时包含"JavaScript"和"Vue"的文档
db.users.find({ tags: { $all: ["JavaScript", "Vue"] } })

查询数组指定位置的元素

可以通过下标指定查询数组特定位置的元素。

// 查询tags数组第一个元素为"前端"的文档
db.users.find({ "tags.0": "前端" })

查询数组长度

使用$size可以匹配数组长度为指定值的文档。

// 查询tags数组长度为3的文档
db.users.find({ tags: { $size: 3 } })

聚合场景下的数组操作

在聚合管道中,可以使用$unwind$group$push等阶段对数组进行处理。

展开数组元素

$unwind可以将数组字段拆分为多个文档,每个文档包含数组中的一个元素。

// 将tags数组展开,每个标签生成一个文档
db.users.aggregate([
  { $match: { name: "张三" } },
  { $unwind: "$tags" }
])

分组聚合数组元素

可以结合$group$push将多个文档的字段聚合为数组。

// 按年龄分组,将同年龄的用户名聚合为数组
db.users.aggregate([
  { $group: { _id: "$age", names: { $push: "$name" } } }
])

MongoDB数组操作document聚合管道update_operator修改时间:2026-07-12 18:24:13

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。