数组更新运算符
本教程共 50 篇 · 第 24 篇 · 更新于 2026-07-30 · 约 8 分钟阅读
24. 数组更新运算符
本节目标:掌握针对数组字段的更新运算符,能往数组里追加、去重加、按条件删、弹首尾,并用 $each/$slice/$sort/$position 精细控制。
普通运算符($set、$inc)对数组也能用,但 MongoDB 还准备了一批数组专用运算符,处理「往数组里塞东西、从数组里剔东西」特别顺手。我们用 users.tags 和 orders.items 两个数组字段来演示。
db.users.insertMany([
{ _id: 1, name: "张三", tags: ["vip", "tech"] },
{ _id: 2, name: "李四", tags: ["new"] }
])
$push:往数组末尾追加
$push 把一个元素加到数组最后。字段不存在会先建一个数组:
// 给张三加一个 "sale" 标签
db.users.updateOne(
{ _id: 1 },
{ $push: { tags: "sale" } }
)
$each:一次追加多个
$push 默认一次只能加一个。想批量加,把值包进 $each:
// 一次给李四加两个标签
db.users.updateOne(
{ _id: 2 },
{ $push: { tags: { $each: ["vip", "tech"] } } }
)
$slice:限制数组长度
配合 $each 用 $slice,可以在追加后只保留最后 N 个,自动砍掉前面的。适合「最近浏览记录」这种只留最新的场景:
// 追加后只保留最近 3 个标签,多余的从头部丢弃
db.users.updateOne(
{ _id: 1 },
{ $push: { tags: { $each: ["hot", "new"], $slice: 3 } } }
)
Note
$slice是负数表示从尾部保留 N 个;正数从头部保留。$slice: 3即只留前 3 个。和$each配合才有意义。
$position:指定插入位置
默认追加到末尾。用 $position 指定下标,把新元素插到数组中间:
// 插到下标 0(最前面)
db.users.updateOne(
{ _id: 1 },
{ $push: { tags: { $each: ["top"], $position: 0 } } }
)
$sort:追加后排序
$sort 让数组在追加后立刻排序,可配合 $each。数字用 1/-1,字符串按字典序:
// 追加并让标签按字典升序排
db.users.updateOne(
{ _id: 2 },
{ $push: { tags: { $each: ["aaa", "zzz"], $sort: 1 } } }
)
Tip
$each、$slice、$position、$sort都是$push的「修饰符」,可以叠加使用,顺序无所谓。
$addToSet:去重地加
如果元素已经在数组里,$addToSet 不会重复添加;不在才加。常做「关注标签」的去重:
// 张三已有 "vip",这条不会让它重复出现
db.users.updateOne(
{ _id: 1 },
{ $addToSet: { tags: "vip" } }
)
批量去重加,同样用 $each:
db.users.updateOne(
{ _id: 1 },
{ $addToSet: { tags: { $each: ["vip", "new", "tech"] } } }
)
$pull:按条件删除元素
$pull 删掉数组里所有匹配条件的元素,和 $push 正好相反:
// 删掉张三所有值为 "sale" 的标签
db.users.updateOne(
{ _id: 1 },
{ $pull: { tags: "sale" } }
)
$pull 也支持条件,比如删掉订单里数量小于 2 的商品:
db.orders.updateOne(
{ _id: 1001 },
{ $pull: { items: { qty: { $lt: 2 } } } }
)
$pop:弹出首尾元素
$pop 删掉数组头部或尾部的一个元素:1 弹末尾,-1 弹开头:
// 弹掉张三标签数组的最后一个
db.users.updateOne(
{ _id: 1 },
{ $pop: { tags: 1 } }
)
运算符一览
| 运算符 | 作用 | 示例场景 |
|---|---|---|
$push | 末尾追加 | 加购物车 |
$each | 多元素(配 $push) | 批量加 |
$slice | 限制长度 | 最近 N 条 |
$position | 插位置 | 插队首 |
$sort | 追加后排序 | 有序列表 |
$addToSet | 去重加 | 关注标签 |
$pull | 按条件删 | 移除某项 |
$pop | 弹首尾 | 栈/队列 |
数组运算符就这些。下章难度升级:如何更新数组里的某个元素,或内嵌文档的某个子字段。