复合操作
概述
在本指南中,您可以学习如何使用Rust驱动程序执行复合操作。
复合操作将读取和写入操作的功能合并为一个操作。原子操作。如果您按顺序执行读取操作和写入操作,有人在操作之间更改了您的目标文档,可能会导致意外结果。当您执行复合操作时,MongoDB通过在修改的文档上放置写锁来防止中间数据更改,直到操作完成。
您可以使用该驱动程序执行以下复合操作:
查找并删除一个文档
查找并更新一个文档
查找并替换一个文档
本指南包括以下部分:
示例数据展示了复合操作示例所使用的样本数据
查找并删除文档描述了如何在单个操作中查找并删除文档
查找并更新文档描述了如何在单个操作中查找并更新文档
查找并替换文档描述了如何在单个操作中查找并替换文档
更多信息提供指向资源链接和本指南中提到的类型和方法的API文档
提示
要了解如何在一次执行多个文档的原子读取和写入操作,请参阅事务指南。
示例数据
本指南中的示例使用以下样本文档。每个文档代表一名学生,并包含有关他们的年龄和他们就读的学校的信息
{ "name": "Alex Johnson", "age": 8, "school": "Lakeside Elementary" }, { "name": "Samara Khan", "age": 11, "school": "Rolling Hills Middle School" }, { "name": "Ben Joseph", "age": 16, "school": "Aurora High School" }, { "name": "Deanna Porowski", "age": 10, "school": "Lakeside Elementary" }
查找并删除文档
的find_one_and_delete()
方法用于查找并删除与指定查询过滤器匹配的第一个文档。如果找到匹配的文档,该方法返回 Some
类型。如果没有文档匹配,则返回 None
类型。
注意
如果您想在查找和删除文档之间执行其他操作,可以调用 find_one()
方法,然后调用 delete_one()
方法。
修改查找和删除行为
您可以通过将选项构建器方法链接到 find_one_and_delete()
来可选地修改 find_one_and_delete()
方法的行为。这些构建器方法设置 FindOneAndDeleteOptions
结构的字段。
以下表格描述了 FindOneAndDeleteOptions
中可用的选项
选项 | 描述 |
---|---|
max_time | 查询可以运行的最大时间(毫秒)。 类型: Duration |
projection | 返回结果时要使用的投影。 类型: Document 默认: None |
sort | 返回结果时要使用的排序顺序。默认情况下,驱动程序以文档的自然顺序或数据库中出现的顺序返回文档。有关更多信息,请参阅服务器手册词汇表中的 natural order。 类型: Document 默认: None |
write_concern | |
排序规则 | |
提示 | |
let_vars | 参数和值的映射。您可以将这些参数作为聚合表达式中的变量访问。此选项仅适用于连接到 MongoDB 服务器版本 5.0 及更高版本。 类型: Document |
注释 | 与操作相关联的任意 Bson 值,以便通过数据库分析器、currentOp 和日志进行跟踪。此选项仅适用于连接到 MongoDB 服务器版本 4.4 及更高版本。类型: Bson 默认: None |
注意
设置选项
您可以通过将选项构建器方法直接链接到 find_one_and_delete()
方法调用来设置 FindOneAndDeleteOptions
字段。如果您正在使用更早版本的驱动程序,您必须通过将选项构建器方法链接到 builder()
方法来构建一个 FindOneAndDeleteOptions
实例。然后,将您的选项实例作为参数传递给 find_one_and_delete()
。
以下代码展示了如何通过将 comment()
方法链接到 find_one_and_delete()
方法来设置 comment
字段
let res = my_coll.find_one_and_delete(filter) .comment(bson!("hello")) .await?;
查找和删除示例
以下示例使用 find_one_and_delete()
方法匹配并删除第一个 age
字段值小于或等于 10
的文档
let filter = doc! { "age": doc! { "$lte": 10 } }; let res = my_coll.find_one_and_delete(filter).await?; println!("Deleted document:\n{:?}", res);
Deleted document: Some(Document({"_id": ObjectId("..."), "name": String("Deanna Porowski"), "age": Int32(10), "school": String("Lakeside Elementary")}))
查找和更新文档
使用find_one_and_update()
方法可以查找并更新第一个符合指定查询条件的文档。该操作根据您在更新文档中提供的规范来更新文档。如果文档符合过滤器条件,则该方法返回一个Some
类型。如果没有文档匹配,则返回一个None
类型。
注意
如果您想在查找和更新文档之间执行其他操作,可以调用find_one()
方法,然后调用update_one()
方法。
修改查找和更新行为
您可以通过将选项构建器方法链接到find_one_and_update()
来可选地修改find_one_and_update()
方法的行为。这些构建器方法设置FindOneAndUpdateOptions
结构体字段。
以下表格描述了FindOneAndUpdateOptions
中可用的选项
选项 | 描述 |
---|---|
array_filters | 指定更新应用到的数组元素的过滤器集合。 类型: Vec<Document> |
bypass_document_validation | |
max_time | 查询可以运行的最大时间(毫秒)。 类型: Duration |
projection | 返回结果时要使用的投影。 类型: Document 默认: None |
return_document | 如果是 Before ,操作返回更新前的文档。如果是After ,操作返回更新后的文档。类型: ReturnDocument 默认: ReturnDocument::Before |
sort | 返回结果时要使用的排序顺序。默认情况下,驱动程序以文档的自然顺序或数据库中出现的顺序返回文档。有关更多信息,请参阅服务器手册词汇表中的 natural order。 类型: Document 默认: None |
upsert | 如果为true,操作在查询过滤器没有匹配文档时插入文档。 类型: bool 默认: false |
write_concern | |
排序规则 | |
提示 | |
let_vars | 参数和值的映射。您可以将这些参数作为聚合表达式中的变量访问。此选项仅适用于连接到 MongoDB 服务器版本 5.0 及更高版本。 类型: Document |
注释 | 与操作相关联的任意 Bson 值,以便通过数据库分析器、currentOp 和日志进行跟踪。此选项仅适用于连接到 MongoDB 服务器版本 4.4 及更高版本。类型: Bson 默认: None |
以下代码展示了如何通过将comment()
方法链接到find_one_and_update()
方法来设置comment
字段
let res = my_coll.find_one_and_update(filter, update) .comment(bson!("hello")) .await?;
查找和更新示例
此示例展示了如何执行以下操作
调用
find_one_and_update()
方法将一个查询过滤器传递给
find_one_and_update()
,该过滤器匹配一个school
值为"Aurora High School"
的文档将一个更新文档传递给
find_one_and_update()
,该文档将school
字段设置为"Durango High School"
并将age
字段增加1
将
return_document()
方法链接到find_one_and_update()
,以返回更新后的匹配文档
let filter = doc! { "school": "Aurora High School" }; let update = doc! { "$set": doc! { "school": "Durango High School" }, "$inc": doc! { "age": 1 } }; let res = my_coll.find_one_and_update(filter, update) .return_document(ReturnDocument::After) .await?; println!("Updated document:\n{:?}", res);
Updated document: Some(Document({"_id": ObjectId("..."), "name": String("Ben Joseph"), "age": Int32(17), "school": String("Durango High School")}))
查找和替换文档
方法 find_one_and_replace()
用于查找并替换第一个与指定查询过滤器匹配的文档。此操作将文档的所有字段(除 _id
字段外)替换为您提供的字段和值。如果文档符合过滤条件,该方法返回 Some
类型。如果没有文档匹配,则返回 None
类型。
注意
如果您想在查找和替换文档之间执行其他操作,可以调用 find_one()
方法,然后调用 replace_one()
方法。
修改查找和替换行为
您可以通过将选项构建器方法链接到 find_one_and_replace()
来可选地修改 find_one_and_replace()
方法的行为。这些构建器方法设置 FindOneAndReplaceOptions
结构的字段。
下表描述了 FindOneAndReplaceOptions
中可用的选项
选项 | 描述 |
---|---|
bypass_document_validation | |
max_time | 查询可以运行的最大时间(毫秒)。 类型: Duration |
projection | 返回结果时要使用的投影。 类型: Document 默认: None |
return_document | 如果是 Before ,操作返回更新前的文档。如果是After ,操作返回更新后的文档。类型: ReturnDocument 默认: ReturnDocument::Before |
sort | 返回结果时要使用的排序顺序。默认情况下,驱动程序以文档的自然顺序或数据库中出现的顺序返回文档。有关更多信息,请参阅服务器手册词汇表中的 natural order。 类型: Document 默认: None |
upsert | 如果为true,操作在查询过滤器没有匹配文档时插入文档。 类型: bool 默认: false |
write_concern | |
排序规则 | |
提示 | |
let_vars | 参数和值的映射。您可以将这些参数作为聚合表达式中的变量访问。此选项仅适用于连接到 MongoDB 服务器版本 5.0 及更高版本。 类型: Document |
注释 | 与操作相关联的任意 Bson 值,以便通过数据库分析器、currentOp 和日志进行跟踪。此选项仅适用于连接到 MongoDB 服务器版本 4.4 及更高版本。类型: Bson 默认: None |
以下代码显示了如何通过将 comment()
方法链接到 find_one_and_replace()
方法来设置 comment
字段
let res = my_coll.find_one_and_replace(filter, replacement) .comment(bson!("hello")) .await?;
查找和替换示例
此示例执行以下操作
调用
find_one_and_replace()
方法将查询过滤器传递给
find_one_and_replace()
,该过滤器匹配一个name
字段的值包含字符串"Johnson"
的文档将替换文档传递给
find_one_and_replace()
,该文档描述了一个新学生将
return_document()
方法链接到find_one_and_replace()
以返回替换后的文档将
projection()
方法链接到find_one_and_replace()
,仅输出name
和school
字段
let filter = doc! { "name": doc! { "$regex": "Johnson" } }; let replacement = doc! { "name": "Toby Fletcher", "age": 14, "school": "Durango High School" }; let res = my_coll.find_one_and_replace(filter, replacement) .return_document(ReturnDocument::After) .projection(doc! { "name": 1, "school": 1, "_id": 0 }) .await?; println!("Document after replacement:\n{:?}", res);
Document after replacement: Some(Document({"name": String("Toby Fletcher"), "school": String("Durango High School")}))
附加信息
要了解更多关于本指南中操作的信息,请参阅以下文档
API 文档
要了解更多关于本指南中提到的方法和类型的信息,请参阅以下 API 文档