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