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对写操作进行确认的级别。

相关推荐
云和数据.ChenGuang1 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys1 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi1 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据2 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi3 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀3 小时前
Redis梳理
数据库·redis·缓存
独行soc3 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天4 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺4 小时前
分布式系统架构:服务容错
数据库·架构
独行soc5 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘