修改文档
概述
在本指南中,您可以学习如何通过使用 update 和 replace 操作来修改 MongoDB 中的文档。
更新操作更改您指定的字段,同时保留其他字段和值不变。替换操作删除文档中除 _id
字段之外的所有现有字段,并用新的字段和值替换它们。_id
字段和用新的字段和值替换它们。
本指南包括以下部分
更新文档 介绍了如何使用驱动程序执行更新操作
替换文档 介绍了如何使用驱动程序执行替换操作
修改更新和替换行为 介绍了如何修改本指南中描述的方法的默认行为
更多信息 提供了本指南中提到的类型和方法的相关资源链接和 API 文档
更新文档模式
在 MongoDB 中,所有更改文档的方法都遵循相同的模式

注意
changeX()
是一个占位符,不是一个真实的方法。
这些方法接受以下参数
一个查询过滤器,用于匹配一个或多个要更改的文档
一个更新文档,指定字段和值更改
Rust 驱动程序提供了以下更改文档的方法
update_one()
update_many()
replace_one()
您可以通过使用复合操作在一次操作中检索和修改数据。有关更多信息,请参阅有关复合操作.
《_id》字段
在MongoDB的集合中,每个文档都有一个唯一且不可变的_id
字段。如果您尝试通过更新或替换操作更改_id
字段,驱动程序将抛出WriteError
异常,并且不会执行任何更新。
更新文档
您可以使用以下方法执行更新操作
update_one()
,用于更新第一个匹配搜索条件的文档update_many()
,用于更新所有匹配搜索条件的文档
您还可以将这些更新操作方法与选项构建器方法链式调用。要了解如何修改更新方法的操作行为,请参阅本指南的《修改更新和替换行为》部分。
参数
每个方法都接受一个查询筛选器和至少包含一个更新运算符的更新文档。更新运算符指定要执行更新的类型,并包含描述更改的字段和值。更新文档使用以下格式
doc! { "<update operator>": doc! { "<field>": <value> } }
要在单个更新文档中指定多个更新,请使用以下格式
doc! { "<update operator>": doc!{"<field>": <value>}, "<update operator>": doc!{"<field>": <value>}, ... }
有关更新运算符和描述的完整列表,请参阅MongoDB服务器手册:更新运算符和描述列表。
注意
更新操作中的聚合管道
如果您正在使用MongoDB服务器版本4.2或更高版本,您可以在更新操作中使用聚合管道。有关MongoDB在聚合管道中支持的聚合阶段的信息,请参阅我们关于使用聚合管道执行更新操作的教程。
返回值
update_one()
和 update_many()
方法在操作成功时返回一个 UpdateResult
类型。该 UpdateResult
类型包含以下属性,用于描述操作
属性 | 描述 |
---|---|
matched_count | 过滤器匹配的文档数量 |
modified_count | 被操作修改的文档数量 |
upserted_id | 插入文档的 _id ,如果没有则返回空 |
如果多个文档与您传递给 UpdateOne()
的查询过滤器匹配,则方法选择并更新第一个匹配的文档。如果没有文档与查询过滤器匹配,则更新操作不会进行任何更改。
更新示例
以下文档描述了某公司的员工
{ "_id": ObjectId('4337'), "name": "Shelley Olson", "department": "Marketing", "role": "Director", "bonus": 3000 }, { "_id": ObjectId('4902'), "name": "Remi Ibrahim", "department": "Marketing", "role": "Consultant", "bonus": 1800 }
此示例使用 update_many()
方法执行更新操作。该 update_many()
方法需要以下参数
一个查询过滤器,以匹配
department
字段值为"Marketing"
的文档一个包含以下更新的更新文档
一个
$set
运算符,用于将department
的值更改为"Business Operations"
并将role
更改为"Analytics Specialist"
一个用于增加
bonus
值的$inc
运算符,增加量为500
let update_doc = doc! { "$set": doc! { "department": "Business Operations", "role": "Analytics Specialist" }, "$inc": doc! { "bonus": 500 } }; let res = my_coll .update_many(doc! { "department": "Marketing" }, update_doc) .await?; println!("Modified documents: {}", res.modified_count);
Modified documents: 2
以下文档反映了先前更新操作的结果变化
{ "_id": ObjectId('4337'), "name": "Shelley Olson", "department": "Business Operations", "role": "Analytics Specialist", "bonus": 3500 }, { "_id": ObjectId('4902'), "name": "Remi Ibrahim", "department": "Business Operations", "role": "Analytics Specialist", "bonus": 2300 }
按ObjectId更新示例
以下文档描述了一家公司的员工
{ "_id": ObjectId('4274'), "name": "Jill Millerton", "department": "Marketing", "role": "Consultant" }
此示例通过指定一个查询过滤器来匹配文档的唯一_id
值来查询前面的文档。然后,代码使用update_one()
方法执行更新操作。update_one()
方法接受以下参数
查询过滤器匹配一个
_id
字段值为ObjectId('4274')
的文档更新文档,创建将
name
字段的值设置为"Jill Gillison"
的指令
let id = ObjectId::from_str("4274").expect("Could not convert to ObjectId"); let filter_doc = doc! { "_id": id }; let update_doc = doc! { "$set": doc! { "name": "Jill Gillison" } }; let res = my_coll .update_one(filter_doc, update_doc) .await?; println!("Modified documents: {}", res.modified_count);
Modified documents: 1
以下文档反映了先前更新操作的结果变化
{ "_id": ObjectId('4274'), "name": "Jill Gillison", "department": "Marketing", "role": "Consultant" }
提示
要了解更多关于_id
字段的信息,请参阅本页的_id Field部分或服务器手册中的ObjectId()方法文档。
替换文档
您可以使用replace_one()
方法执行替换操作。此方法用您指定的新字段和值替换文档的所有现有字段(除_id
字段外)。
您还可以将选项构建器方法链接到替换操作方法。有关修改replace_one()
方法行为的信息,请参阅本指南中的修改更新和替换行为部分。
参数
replace_one()
方法接受一个查询过滤器和一份 替换文档,其中包含将替换现有文档的字段和值。替换文档使用以下格式
doc! { "<field>": <value>, "<field>": <value>, ... }
返回值
replace_one
方法在操作成功时返回一个 UpdateResult
类型。该类型包含以下属性,用于描述操作
属性 | 描述 |
---|---|
matched_count | 过滤器匹配的文档数量 |
modified_count | 被操作修改的文档数量 |
upserted_id | 插入文档的 _id ,如果没有则返回空 |
如果您传递给 replace_one()
的查询过滤器匹配多个文档,则该方法将选择并替换第一个匹配的文档。如果没有文档匹配查询过滤器,替换操作不会进行任何更改。
替换示例
以下文档描述了一家公司的员工
{ "_id": ObjectId('4501'), "name": "Matt DeGuy", "role": "Consultant", "team_members": [ "Jill Gillison", "Susan Lee" ] }
此示例使用 replace_one()
方法用以下字段替换前面的文档
一个
name
值为"Susan Lee"
一个
role
值为"Lead Consultant"
一个
team_members
值为[ "Jill Gillison" ]
let replace_doc = doc! { "name": "Susan Lee", "role": "Lead Consultant", "team_members": vec! [ "Jill Gillison" ] }; let res = my_coll .replace_one(doc! { "name": "Matt DeGuy" }, replace_doc) .await?; println!( "Matched documents: {}\nModified documents: {}", res.matched_count, res.modified_count );
Matched documents: 1 Modified documents: 1
替换的文档包含替换文档的内容和不可变的 _id
字段
{ "_id": ObjectId('4501'), "name": "Susan Lee", "role": "Lead Consultant", "team_members": [ "Jill Gillison" ] }
修改更新和替换行为
您可以通过调用设置 UpdateOptions
结构体字段的选项方法来修改 update_one()
、update_many
和 replace_one()
方法的行为。
注意
设置选项
您可以通过直接将选项构建器方法链接到更新或替换方法调用来设置 UpdateOptions
字段。如果您正在使用较早版本的驱动程序,您必须通过将选项构建器方法链接到 builder()
方法来构建一个 UpdateOptions
实例。然后,将您的选项实例作为参数传递给 update_one()
、update_many
或 replace_one()
。
以下表格描述了 UpdateOptions
中可用的选项
选项 | 描述 |
---|---|
array_filters | 指定应用更新的数组元素的过滤器集合。 类型: Vec<Document> |
bypass_document_validation | |
upsert | 如果为真,则在没有匹配查询过滤器的情况下插入文档。 类型: bool |
collation | |
hint | 用于操作的操作索引。此选项仅在连接到 MongoDB 服务器版本 4.2 及更高版本时可用。 类型: Hint 默认值: None |
write_concern | |
let_vars | 参数和值的映射。这些参数可以在聚合表达式中作为变量访问。此选项仅适用于连接到 MongoDB 服务器版本 5.0 及以上。 类型: Document |
comment | 与操作相关联的任意 Bson 值,用于通过数据库分析器、currentOp 和日志跟踪它。此选项仅适用于连接到 MongoDB 服务器版本 4.4 及以上。类型: Bson 默认值: None |
以下代码演示了如何通过将 upsert()
方法链接到 update_one()
方法来设置 upsert
字段
let res = my_coll .update_one(filter_doc, update_doc) .upsert(true) .await?;
更多信息
有关本指南中的概念更多信息的文档
有关更新和替换操作的运行示例,请参阅以下用法示例
有关更新运算符的更多信息,请参阅服务器手册中的更新运算符。
API 文档
要了解更多关于本指南中提到的方法和类型,请参阅以下API文档