更新文档
概述
在此指南中,您可以了解如何使用Java反应式流驱动程序通过执行更新操作来更新MongoDB集合中的文档。
更新操作可以更新MongoDB集合中的一个或多个文档。您可以使用以下方法执行更新操作:updateOne()
或 updateMany()
方法。
示例数据
本指南中的示例使用来自Atlas示例数据集的 sample_restaurants
数据库中的 restaurants
集合。Atlas示例数据集.
要了解如何创建免费的MongoDB Atlas集群并加载示例数据集,请参阅入门教程。入门教程。
重要
项目反应器库
本指南使用项目反应器库来消费Java反应流驱动程序方法返回的 Publisher
实例。要了解有关项目反应器库及其使用方法的更多信息,请参阅Reactor文档中的入门。要了解本指南中如何使用项目反应器库方法,请参阅将数据写入MongoDB指南。
更新操作
您可以使用以下方法在MongoDB中执行更新操作
updateOne()
,用于更新符合搜索条件的第一个文档updateMany()
,用于更新符合搜索条件的所有文档
每个更新方法都需要以下参数
查询过滤器文档,用于确定要更新的文档。有关使用查询过滤器的更多信息,请参阅过滤器部分。
更新文档,用于指定更新操作符(要执行的类型)以及要更改的字段和值。有关更新操作符的更多信息,请参阅更新操作符部分。
过滤器
每个更新方法都需要一个查询过滤器,用于指定确定要选择哪些文档进行更新的搜索条件。为了便于创建过滤器对象,驱动程序提供了提供过滤器条件辅助方法的Filters
类。
要查看Filters
辅助方法的列表,请参阅Filters API文档。有关查询过滤器的更多信息,请参阅MongoDB服务器手册中的查询过滤器文档部分。
更新运算符
要更改文档中的字段,MongoDB提供了更新运算符。要使用更新运算符指定要进行的修改,创建一个更新文档。为了方便创建更新文档,驱动程序提供了一个包含过滤条件辅助方法的Updates
辅助类。
重要
_id
字段是不可变的,因此您不能更改文档中_id
字段的值。
有关更新运算符的更多信息,请参阅服务器手册中的更新运算符。
更新单个文档
要在MongoDB集合中更新单个文档,请调用updateOne()
方法并传入您的查询筛选器和更新运算符。然后,将updateOne()
的结果传递给来自Mono
的静态方法Mono.from()
。 Mono
是来自Project Reactor库的一个类。在Java Reactive Streams中,驱动方法返回冷Publisher
实例,这意味着除非您订阅返回的Publisher
,否则相应的操作不会发生。本指南使用Project Reactor库来消费它们。有关Mono
的更多信息,请参阅Project Reactor文档中的Mono。
以下示例使用updateOne()
方法将匹配的文档从“Bagels N Buns”更新为“2 Bagels 2 Buns”。
Publisher<UpdateResult> updatePublisher = restaurants.updateOne(eq("name", "Bagels N Buns"), set("name", "2 Bagels 2 Buns")); Mono.from(updatePublisher).block();
更新多个文档
要更新MongoDB集合中的多个文档,请调用 updateMany()
方法,并传递您的查询过滤器和更新运算符。然后,将 updateMany()
的结果传递给来自 Mono
的静态 Mono.from()
方法。 Mono
是 Project Reactor 库中的一个类。在 Java Reactive Streams 中,驱动程序方法返回冷 Publisher
实例,这意味着除非您订阅返回的 Publisher
,否则相应的操作不会发生。本指南使用 Project Reactor 库来消费它们。有关 Mono
的更多信息,请参阅 Project Reactor 文档中的 Mono。
以下示例使用 updateMany()
方法将所有具有 cuisine
值为 "Pizza"
的文档的 cuisine
值更新为 "Pasta"
。
Publisher<UpdateResult> updatePublisher = restaurants.updateMany(eq("cuisine", "Pizza"), set("cuisine", "Pasta")); Mono.from(updatePublisher).block();
自定义更新操作
UpdateOptions
类包含修改更新方法行为的方法。要使用 UpdateOptions
类,构造一个新实例,然后调用一个或多个其方法以修改更新操作。您可以链式调用这些方法。要将更新操作的行为修改为,将类实例和链式方法调用作为第三个参数传递给 updateOne()
或 updateMany()
方法。
您可以在 UpdateOptions
类中使用以下可选方法来修改更新操作
方法 | 描述 |
---|---|
| 指定更新应用于哪些数组元素。 |
| 指定更新操作是否绕过文档验证。这允许您更新不满足模式验证要求的文档(如果存在)。有关模式验证的更多信息,请参阅 MongoDB 服务器手册中的模式验证。 |
collation(Collation collation) | 指定排序结果时使用的语言排序类型。有关更多信息,请参阅 MongoDB 服务器手册中的排序。 |
comment(Bson comment) | 将 Bson 注释附加到操作。有关更多信息,请参阅 MongoDB 服务器手册中的插入命令字段指南。 |
comment(String comment) | 将 String 注释附加到操作。有关更多信息,请参阅 MongoDB 服务器手册中的插入命令字段指南。 |
hint(Bson hint) | 将操作索引设置为 Bson 值。有关更多信息,请参阅 MongoDB 服务器手册中的提示语句。 |
hint(String hint) | 将操作索引设置为 String 值。有关更多信息,请参阅 MongoDB 服务器手册中的提示语句。 |
let(Bson variables) | 指定参数名称和值的映射。值必须是常数或无引用文档字段的封闭表达式。有关更多信息,请参阅 MongoDB 服务器手册中的let 语句。 |
upsert(Boolean upsert) | 指定更新操作是否在查询过滤器不匹配任何文档时执行 upsert 操作。有关更多信息,请参阅 MongoDB 服务器手册中的upsert 语句。 |
示例
以下代码使用 updateMany()
方法查找所有 borough
字段值为 "Manhattan"
的文档。然后,它将这些文档中的 borough
值更新为 "Manhattan (north)"
。因为将 upsert
选项设置为 true
,所以如果查询过滤器不匹配任何现有文档,Java Reactive Streams 驱动程序将插入一个新的文档。
Publisher<UpdateResult> updatePublisher = restaurants.updateMany( eq("borough", "Manhattan"), set("borough", "Manhattan (north)"), new UpdateOptions().upsert(true)); Mono.from(updatePublisher).block();
返回值
updateOne()
和 updateMany()
方法都返回一个 UpdateResult
对象。该 UpdateResult
类型包含以下实例方法
方法 | 描述 |
---|---|
getMatchedCount() | 匹配查询过滤器的文档数量,无论更新了多少个。 |
getModifiedCount() | 更新操作修改的文档数量。如果更新的文档与原始文档相同,则不包括在内。 |
getUpsertedId() | 如果驱动程序执行了 upsert,则返回数据库中 upserted 的文档的 ID。否则返回 null 。 |
wasAcknowledged() | 如果更新被确认,则返回 true。 |
其他信息
有关更新操作符的更多信息,请参阅 MongoDB 服务器手册中的 更新操作符。
有关使用 Java Reactive Streams 驱动程序插入文档的可执行代码示例,请参阅 写入 MongoDB 数据 指南。
API 文档
要了解本指南中讨论的任何方法或类型,请参阅以下 API 文档