MongoDB 更新操作(Update)

本文将介绍 MongoDB 的更新操作(Update)。以及 db.collection.updateOne()、db.collection.updateMany() 和 db.collection.replaceOne() 方法。

更新操作修改集合中的现有文档。MongoDB提供了以下方法来更新集合的文档:

  • db.collection.updateOne() New in version 3.2

  • db.collection.updateMany() New in version 3.2

  • db.collection.replaceOne() New in version 3.2

在 MongoDB 中,更新操作以单个集合为目标。MongoDB 中的所有写操作都是单个文档级别上的原子操作。可以指定过滤器去更新你想要更新的文档。这些过滤器的使用与读取操作的语法相同。如下图:

MongoDB 更新操作(Update)

下面示例使用 inventory 集合。若要创建或填充 inventory 集合,请在 Mongo Shell 中运行以下命令:

db.inventory.insertMany([
   { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
   { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
   { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
   { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
   { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
   { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
   { item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
]);

更新集合中的文档

要更新文档,MongoDB 提供更新运算符(如:$set)来修改字段值。若要使用更新运算符,请将表单的更新文档传递给 update 方法:

{
  <update operator>: { <field1>: <value1>, ... },
  <update operator>: { <field2>: <value2>, ... },
  ...
}

如果字段不存在,某些更新运算符(如:$set)将创建该字段。

注意:从 MongoDB4.2 开始,MongoDB 可以接受一个聚合管道来指定要进行的修改,而不是更新文档。

更新单个文档

下面的示例使用 inventory 集合上的 db.Collection.updateOne() 方法来更新第一个文档,其中 item 等于 “paper”:

db.inventory.updateOne(
   { item: "paper" },
   {
     $set: { "size.uom": "cm", status: "P" },
     $currentDate: { lastModified: true }
   }
)

更新操作:

  • 使用 $set 运算符将 size.uom 字段的值更新为 “cm”,将 status 字段的值更新为 “P”

  • 使用 $currentDate 运算符将 lastModied 字段的值更新为当前日期。如果 lastModifiedfield 不存在,则 $currentDate 将创建该字段。

更新多个文档

New in version 3.2.

下面的示例使用 inventory 集合上的 db.collection.updateMany() 方法来更新 qty 小于 50 的所有文档:

db.inventory.updateMany(
   { "qty": { $lt: 50 } },
   {
     $set: { "size.uom": "in", status: "P" },
     $currentDate: { lastModified: true }
   }
)

更新操作:

  • 使用 $set 运算符将 size.uom 字段的值更新为 “in”,将 status 字段的值更新为 “P”

  • 使用 $currentDate 运算符将 lastModied 字段的值更新为当前日期。如果 lastModifiedfield 不存在,则 $currentDate 将创建该字段。

替换文档

若要替换除 _id 字段以外的文档的全部内容,请将一个全新的文档作为第二个参数传递给 db.collection.replaceOne() 方法。

  • 替换文档时,替换文档必须只包含字段/值对;即不包括更新运算符表达式。

  • 替换文档可以有与原始文档不同的字段。在替换文档中,您可以省略 _id 字段,因为 _id 字段是不可变的;但是,如果包含 _id 字段,则它必须具有与当前值相同的值。

下面的示例替换 invertory 集合中的第一个文档,其中:item:"paper"

db.inventory.replaceOne(
   { item: "paper" },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)

更新动作

原子性(Atomicity)

MongoDB 中的所有写操作都是单个文档级别上的原子操作。

_id 字段

一旦设置好了,就不能更新 _id 字段的值,也不能用具有不同 _id 字段值的替换文档替换现有文档。

字段顺序

MongoDB 在写操作之后保留文档字段的顺序,但下列情况除外:

  • _id字段始终是文档中的第一个字段。

  • 包括重新命名字段名的更新可能会导致文档中字段的重新排序。

一个不注意小事情的人,永远不会成功大事业。——戴尔·卡耐基
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号