MongoDB 更新时,最常见的不是“整袋重写”,而是“按位置改内容”。
更新一份:
db.users.updateOne(
{ email: "chenyi@example.com" },
{ $set: { status: "inactive" } }
)批量更新:
db.orders.updateMany(
{ status: "pending" },
{ $set: { reviewed: false } }
)常用更新操作符:
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:
db.settings.updateOne(
{ userId: 101 },
{ $set: { theme: "light", language: "zh-CN" } },
{ upsert: true }
)更新数组中的特定元素时,也可以精确定位:
db.orders.updateOne(
{ orderNo: "ORD-9001", "items.sku": "BOOK-001" },
{ $inc: { "items.$.qty": 1 } }
)一个很实用的写法,是把“条件判断”和“更新动作”合在一起,防止并发下写坏数据:
db.inventory.updateOne(
{ sku: "BOOK-001", stock: { $gte: 1 } },
{ $inc: { stock: -1 } }
)这相当于:
只有库存至少还有 1 件,才允许扣减这类写法在 MongoDB 里非常重要,因为单文档写操作本身是原子的。