文档菜单
文档首页
/ / /
Rust 驱动
/ /

复合操作

本页内容

  • 概述
  • 示例数据
  • 查找并删除文档
  • 修改查找和删除行为
  • 查找和删除示例
  • 查找并更新文档
  • 修改查找和更新行为
  • 查找和更新示例
  • 查找并替换文档
  • 修改查找和替换行为
  • 查找和替换示例
  • 更多信息
  • API 文档

在本指南中,您可以学习如何使用Rust驱动程序执行复合操作。

复合操作将读取和写入操作的功能合并为一个操作。原子操作。如果您按顺序执行读取操作和写入操作,有人在操作之间更改了您的目标文档,可能会导致意外结果。当您执行复合操作时,MongoDB通过在修改的文档上放置写锁来防止中间数据更改,直到操作完成。

您可以使用该驱动程序执行以下复合操作:

  • 查找并删除一个文档

  • 查找并更新一个文档

  • 查找并替换一个文档

本指南包括以下部分:

提示

要了解如何在一次执行多个文档的原子读取和写入操作,请参阅事务指南。

本指南中的示例使用以下样本文档。每个文档代表一名学生,并包含有关他们的年龄和他们就读的学校的信息

{ "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
操作的写关注。如果您不设置此选项,则操作将继承集合设置的写关注。有关写关注的更多信息,请参阅服务器手册中的 写关注

类型: WriteConcern
排序规则
排序结果时使用的排序规则。有关排序规则的更多信息,请参阅 排序规则 指南。

类型: Collation
默认: None
提示
用于操作的索引。有关索引的更多信息,请参阅服务器手册中的 索引。此选项仅适用于连接到 MongoDB 服务器版本 4.4 及更高版本。

类型: Hint
默认: None
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
如果设置为true,允许驱动程序执行违反文档级验证的写入操作。有关验证的更多信息,请参阅服务器手册中的Schema Validation

类型:bool
默认:false
max_time
查询可以运行的最大时间(毫秒)。

类型: Duration
projection
返回结果时要使用的投影。

类型: Document
默认: None
return_document
如果是Before,操作返回更新前的文档。如果是After,操作返回更新后的文档。

类型:ReturnDocument
默认:ReturnDocument::Before
sort
返回结果时要使用的排序顺序。默认情况下,驱动程序以文档的自然顺序或数据库中出现的顺序返回文档。有关更多信息,请参阅服务器手册词汇表中的 natural order

类型: Document
默认: None
upsert
如果为true,操作在查询过滤器没有匹配文档时插入文档。

类型:bool
默认:false
write_concern
操作的写关注。如果您不设置此选项,则操作将继承集合设置的写关注。有关写关注的更多信息,请参阅服务器手册中的 写关注

类型: WriteConcern
排序规则
排序结果时使用的排序规则。有关排序规则的更多信息,请参阅 排序规则 指南。

类型: Collation
默认: None
提示
用于操作的索引。有关索引的更多信息,请参阅服务器手册中的 索引。此选项仅适用于连接到 MongoDB 服务器版本 4.4 及更高版本。

类型: Hint
默认: None
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
如果设置为true,允许驱动程序执行违反文档级验证的写入操作。有关验证的更多信息,请参阅服务器手册中的Schema Validation

类型:bool
默认:false
max_time
查询可以运行的最大时间(毫秒)。

类型: Duration
projection
返回结果时要使用的投影。

类型: Document
默认: None
return_document
如果是Before,操作返回更新前的文档。如果是After,操作返回更新后的文档。

类型:ReturnDocument
默认:ReturnDocument::Before
sort
返回结果时要使用的排序顺序。默认情况下,驱动程序以文档的自然顺序或数据库中出现的顺序返回文档。有关更多信息,请参阅服务器手册词汇表中的 natural order

类型: Document
默认: None
upsert
如果为true,操作在查询过滤器没有匹配文档时插入文档。

类型:bool
默认:false
write_concern
操作的写关注。如果您不设置此选项,则操作将继承集合设置的写关注。有关写关注的更多信息,请参阅服务器手册中的 写关注

类型: WriteConcern
排序规则
排序结果时使用的排序规则。有关排序规则的更多信息,请参阅 排序规则 指南。

类型: Collation
默认: None
提示
用于操作的索引。有关索引的更多信息,请参阅服务器手册中的 索引。此选项仅适用于连接到 MongoDB 服务器版本 4.4 及更高版本。

类型: Hint
默认: None
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(),仅输出 nameschool 字段

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 文档

返回

批量操作