全书目录

第十九篇:MongoDB 完全指南 —— 弹性档案仓宇宙

第八章:再学会改档案 —— 更新基础

1 分钟 188 字 第 359 / 962 个阅读单元

MongoDB 更新时,最常见的不是“整袋重写”,而是“按位置改内容”。

更新一份:

javascript
db.users.updateOne(
  { email: "chenyi@example.com" },
  { $set: { status: "inactive" } }
)

批量更新:

javascript
db.orders.updateMany(
  { status: "pending" },
  { $set: { reviewed: false } }
)

常用更新操作符:

javascript
db.wallets.updateOne(
  { userId: 101 },
  { $inc: { balance: 50 } }
)

db.posts.updateOne(
  { _id: 1 },
  { $push: { tags: "mongodb" } }
)

db.posts.updateOne(
  { _id: 1 },
  { $addToSet: { tags: "database" } }
)

db.posts.updateOne(
  { _id: 1 },
  { $pull: { tags: "old-tag" } }
)

如果文档不存在,就顺便创建,可以用 upsert

javascript
db.settings.updateOne(
  { userId: 101 },
  { $set: { theme: "light", language: "zh-CN" } },
  { upsert: true }
)

更新数组中的特定元素时,也可以精确定位:

javascript
db.orders.updateOne(
  { orderNo: "ORD-9001", "items.sku": "BOOK-001" },
  { $inc: { "items.$.qty": 1 } }
)

一个很实用的写法,是把“条件判断”和“更新动作”合在一起,防止并发下写坏数据:

javascript
db.inventory.updateOne(
  { sku: "BOOK-001", stock: { $gte: 1 } },
  { $inc: { stock: -1 } }
)

这相当于:

text
只有库存至少还有 1 件,才允许扣减

这类写法在 MongoDB 里非常重要,因为单文档写操作本身是原子的