首页 / MongoDB 入门教程 / 数组更新运算符

MongoDB 入门教程

数组更新运算符

本教程共 50 篇 · 第 24 篇 · 更新于 2026-07-30 · 约 8 分钟阅读

MongoDBMongoDB 入门教程数组更新pushpulladdToSet

24. 数组更新运算符

本节目标:掌握针对数组字段的更新运算符,能往数组里追加、去重加、按条件删、弹首尾,并用 $each/$slice/$sort/$position 精细控制。

普通运算符($set$inc)对数组也能用,但 MongoDB 还准备了一批数组专用运算符,处理「往数组里塞东西、从数组里剔东西」特别顺手。我们用 users.tagsorders.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弹首尾栈/队列

数组运算符就这些。下章难度升级:如何更新数组里的某个元素,或内嵌文档的某个子字段。