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.uom
和status
的值分别更新为"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.uom
和status
的值分别更新为"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中进行文档更新可以按照下面的步骤进行操作:
-
打开集合
- 打开MongoDB Atlas UI,点击侧边栏的Database
- 找到对应的数据库实例,点击Browse Collections
- 在左侧的导航面板选择
sample_supplies
数据库 - 在左边的导航面板选择
sales
集合
-
指定文档的过滤条件
可以给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日之间的所有文档。 -
编辑文档
要编辑查询结果中显示的文档,可将鼠标悬停在该文档上并单击铅笔图标。在文档编辑器中,可以:
- 添加新字段。
- 删除现有字段。
- 编辑字段的名称、值或类型。
- 恢复特定更改。
-
保存更改
点击Update按钮,可确认并保存更改。
更新行为
原子性
在MongoDB中,单个文档的写操作具有原子性。
_id字段
一旦设置,就不能更新_id
字段的值,也不能用具有不同_id
字段值的替换文档替换现有文档。
字段顺序
对于写入操作,MongoDB 会保留文档字段的顺序,但以下情况除外:
_id
字段始终是文档中的第一个字段。- 包括重命名字段名称的更新可能会导致文档中字段的重新排序。
Upsert选项
如果updateOne()
、updateMany()
、ReplaceOne()
包含upsert : true
并且没有文档与指定的过滤器匹配,则该操作将创建一个新文档并将其插入。如果存在匹配的文档,则该操作将修改或替换匹配的一个或多个文档。
写确认
通过写关注,可以指定MongoDB对写操作进行确认的级别。