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

修改文档

本页内容

  • 概述
  • 更新文档模式
  • _id 字段
  • 更新文档
  • 参数
  • 返回值
  • 更新示例
  • 按 ObjectId 更新示例
  • 替换文档
  • 参数
  • 返回值
  • 替换示例
  • 修改更新和替换行为
  • 附加信息
  • API 文档

在本指南中,您可以学习如何通过使用 updatereplace 操作来修改 MongoDB 中的文档。

更新操作更改您指定的字段,同时保留其他字段和值不变。替换操作删除文档中除 _id 字段之外的所有现有字段,并用新的字段和值替换它们。_id 字段和用新的字段和值替换它们。

本指南包括以下部分

  • 更新文档 介绍了如何使用驱动程序执行更新操作

  • 替换文档 介绍了如何使用驱动程序执行替换操作

  • 修改更新和替换行为 介绍了如何修改本指南中描述的方法的默认行为

  • 更多信息 提供了本指南中提到的类型和方法的相关资源链接和 API 文档

在 MongoDB 中,所有更改文档的方法都遵循相同的模式

changeX() method signature

注意

changeX() 是一个占位符,不是一个真实的方法。

这些方法接受以下参数

  • 一个查询过滤器,用于匹配一个或多个要更改的文档

  • 一个更新文档,指定字段和值更改

Rust 驱动程序提供了以下更改文档的方法

  • update_one()

  • update_many()

  • replace_one()

您可以通过使用复合操作在一次操作中检索和修改数据。有关更多信息,请参阅有关复合操作.

在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
}

以下文档描述了一家公司的员工

{
"_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_manyreplace_one() 方法的行为。

注意

设置选项

您可以通过直接将选项构建器方法链接到更新或替换方法调用来设置 UpdateOptions 字段。如果您正在使用较早版本的驱动程序,您必须通过将选项构建器方法链接到 builder() 方法来构建一个 UpdateOptions 实例。然后,将您的选项实例作为参数传递给 update_one()update_manyreplace_one()

以下表格描述了 UpdateOptions 中可用的选项

选项
描述
array_filters
指定应用更新的数组元素的过滤器集合。

类型: Vec<Document>
bypass_document_validation
如果设置为 true,则允许驱动程序执行违反文档级验证的写操作。有关验证的更多信息,请参阅关于 Schema Validation 的指南。

类型: bool
默认值: false
upsert
如果为真,则在没有匹配查询过滤器的情况下插入文档。

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

类型: Collation
默认值: None
hint
用于操作的操作索引。此选项仅在连接到 MongoDB 服务器版本 4.2 及更高版本时可用。

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

类型: WriteConcern
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文档

返回

插入