修改文档
概述
您可以使用 update 和 replace 操作来修改 MongoDB 集合中的文档。更新操作修改文档的字段和值,同时保持其他字段和值不变。替换操作用指定的字段和值替换现有文档中的所有字段和值,同时保持_id
字段值不变。
Node.js 驱动程序提供了以下方法来更改文档
updateOne()
updateMany()
replaceOne()
提示
互动实验室
此页面包含一个简短的互动实验室,演示如何使用 updateMany()
方法修改数据。您可以直接在浏览器窗口中完成此实验室,无需安装 MongoDB 或代码编辑器。
要启动实验室,请点击打开互动教程 按钮,位于页面顶部。要将实验室扩展到全屏格式,请点击实验室面板右上角的全屏按钮(⛶)。
更新文档
要更新一个或多个文档,创建一个指定 更新操作符(要执行的类型更新)以及描述更改的字段和值的 更新文档。更新文档使用以下格式
{ <update operator>: { <field> : { ... }, <field> : { } }, <update operator>: { ... } }
更新文档的顶级包含以下一个或多个更新操作符
$set
:用指定值替换字段值$inc
:增加或减少字段值$rename
:重命名字段$unset
:删除字段$mul
:将字段值乘以指定的数字
有关完整更新运算符及其使用方法的列表,请参阅MongoDB服务器手册。.
更新运算符仅适用于您的更新文档中与之关联的字段。
注意
更新操作中的聚合管道
如果您正在使用MongoDB 4.2或更高版本,您可以在更新操作中使用由聚合阶段子集组成的聚合管道。有关MongoDB在更新操作中支持的聚合阶段的更多信息,请参阅我们关于使用聚合管道构建更新文档的教程。
示例
假设有一个位于myDB.items
集合中的文档,其中包含描述待售物品的字段、价格和可用数量
{ _id: 465, item: "Hand-thrown ceramic plate", price: 32.50, quantity: 7, }
如果您使用$set
更新运算符为quantity
指定新值,则可以使用以下更新文档
const myDB = client.db("myDB"); const myColl = myDB.collection("items"); const filter = { _id: 465 }; // update the value of the 'quantity' field to 5 const updateDocument = { $set: { quantity: 5, }, }; const result = await myColl.updateOne(filter, updateDocument);
更新后的文档如下所示,其中quantity
字段已更新,而所有其他值保持不变
{ _id: 465, item: "Hand-thrown ceramic plate", price: 32.50, quantity: 5, }
如果更新操作无法匹配集合中的任何文档,则不会进行任何更改。更新操作可以配置为执行一个upsert,它尝试执行更新,但如果没有匹配的文档,则插入一个具有指定字段和值的新的文档。
您不能修改文档的_id
字段,也不能将字段更改为违反唯一索引约束的值。有关更多信息,请参阅MongoDB服务器手册中的唯一索引。
替换文档
要执行替换操作,创建一个包含您要在替换操作中使用的字段和值的替换文档。替换文档使用以下格式
{ <field>: { <value> }, <field>: { ... } }
替换文档是您希望替换与查询过滤器匹配的现有文档的文档。
示例
假设有一个位于myDB.items
集合中的文档,其中包含描述待售物品的字段、价格和可用数量
{ _id: 501, item: "3-wick beeswax candle", price: 18.99, quantity: 10, }
假设您想要用一个包含完全不同项目的描述的文档替换此文档。您的替换操作可能如下所示
const myDB = client.db("myDB"); const myColl = myDB.collection("items"); const filter = { _id: 501 }; // replace the matched document with the replacement document const replacementDocument = { item: "Vintage silver flatware set", price: 79.15, quantity: 1, }; const result = await myColl.replaceOne(filter, replacementDocument);
替换文档包含替换文档的内容和不可变的_id
字段,如下所示
{ _id: 501, item: "Vintage silver flatware set", price: 79.15, quantity: 1, }
如果替换操作在集合中未能匹配任何文档,它不会进行任何更改。替换操作可以配置为执行upsert操作,该操作尝试执行替换,但如果没有任何匹配的文档,它将插入一个新的文档,其中包含指定的字段和值。
您不能修改文档的_id
字段,也不能将字段更改为违反唯一索引约束的值。有关更多信息,请参阅MongoDB服务器手册中的唯一索引。