MongoDB CRUD操作:更新文档

MongoDB CRUD操作:更新文档

文章目录

可以使用下面的方式更新MongoDB集合的文档:

  • 使用编程语言提供的驱动程序,在应用中调用API进行更新。
  • 使用MongoDB Atlas UI更新文档。
  • 使用MongoDB Compass、mongosh。
  • 使用其他第三方工具。

使用下面的脚本创建inventory集合,下面的例子会使用inventory集合:

js 复制代码
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)对字段值进行修改,在使用更新操作符时,需要向更新方法传递如下格式的文档:

js 复制代码
{
  <update operator>: { <field1>: <value1>, ... },
  <update operator>: { <field2>: <value2>, ... },
  ...
}

一些更新操作符如$set,在字段不存在时会自动创建字段。另外,MongoDB可以接受聚合管道作为更新文档。

更新单个文档

下面的例子使用db.collection.updateOne()方法,更新inventory集合中第一个item"paper"的文档:

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

在这个更新操作中:

  • 使用$set操作符将字段size.uomstatus的值分别更新为"cm""P"
  • 使用$currentDate操作符将lastModified字段的值更新为当前日期,如果lastModified字段不存在,会被自动创建。

更新多个文档

下面的例子使用db.collection.updateMany()方法,对inventory集合中所有qty字段为50的文档进行更新:

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

在这个更新操作中:

  • 使用$set操作符将字段size.uomstatus的值分别更新为"cm""P"
  • 使用$currentDate操作符将lastModified字段的值更新为当前日期,如果lastModified字段不存在,会被自动创建。

文档替换

如果要替换除_id字段的全部内容,可将全新文档作为第二个参数传递给db.collection.replaceOne()

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

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

下面的实力替换inventory集合的第一个item"paper"的文档:

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

在MongoDB Atlas中更新文档

在 MongoDB Atlas UI 中,一次只能更新一个文档。要更新多个文档或替换整个文档,可以使用mongosh或MongoDB驱动程序连接到Atlas部署,并按照上面的示例进行操作。

下面的示例使用了sample_supplies样本数据集。在MongoDB Atlas中进行文档更新可以按照下面的步骤进行操作:

  1. 打开集合

    • 打开MongoDB Atlas UI,点击侧边栏的Database
    • 找到对应的数据库实例,点击Browse Collections
    • 在左侧的导航面板选择sample_supplies数据库
    • 在左边的导航面板选择sales集合
  2. 指定文档的过滤条件

    可以给Field字段为文档指定一个过滤条件,用于搜索符合条件的文档。

    将下面的查询条件文档拷贝到搜索栏的Filter 字段,然后点击Apply

    js 复制代码
    { saleDate: { $gte: { $date: "2016-01-01T00:00-00:00" }, $lte: { $date: "2016-01-02T00:00-00:00" } } }

    查询条件返回sample_supplies.sales集合中saleDate字段在UTC时间2016年1月1日至2日之间的所有文档。

  3. 编辑文档

    要编辑查询结果中显示的文档,可将鼠标悬停在该文档上并单击铅笔图标。在文档编辑器中,可以:

    • 添加新字段。
    • 删除现有字段。
    • 编辑字段的名称、值或类型。
    • 恢复特定更改。
  4. 保存更改

    点击Update按钮,可确认并保存更改。

更新行为

原子性

在MongoDB中,单个文档的写操作具有原子性。

_id字段

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

字段顺序

对于写入操作,MongoDB 会保留文档字段的顺序,但以下情况除外:

  • _id字段始终是文档中的第一个字段。
  • 包括重命名字段名称的更新可能会导致文档中字段的重新排序。

Upsert选项

如果updateOne()updateMany()ReplaceOne()包含upsert : true并且没有文档与指定的过滤器匹配,则该操作将创建一个新文档并将其插入。如果存在匹配的文档,则该操作将修改或替换匹配的一个或多个文档。

写确认

通过写关注,可以指定MongoDB对写操作进行确认的级别。

相关推荐
看山还是山,看水还是。24 分钟前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec30 分钟前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa40 分钟前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke1 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
程序猿小D1 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
小宇成长录1 小时前
Mysql:数据库和表增删查改基本语句
数据库·mysql·数据库备份
团儿.2 小时前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构
程序猿小D2 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
权^3 小时前
MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)
大数据·数据库·学习·mysql
Code成立4 小时前
1、深入理解Redis线程模型
数据库·redis·bootstrap