MongoDB CRUD操作:更新文档

MongoDB CRUD操作:更新文档

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

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

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

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 operator>: { <field1>: <value1>, ... },
  <update operator>: { <field2>: <value2>, ... },
  ...
}

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

更新单个文档

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

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的文档进行更新:

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"的文档:

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

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

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原子星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值