Overview
在本指南中,您可以学习如何使用Java Reactive Streams驱动程序通过执行更新操作来更新MongoDB集合中的文档。
更新操作可更新MongoDB集合中的一个或多个文档。 您可以使用updateOne()或updateMany()方法执行更新操作。
样本数据
本指南中的示例使用Atlas示例数据集中sample_restaurants数据库中的restaurants集合。
要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅入门教程。
重要
项目 Reactor 库
本指南使用 Project Reactor 库来使用Java Reactive Streams驱动程序方法返回的 Publisher 实例。要学习;了解有关 Project Reactor 库及其使用方法的更多信息,请参阅 Reactor 文档中的入门。要进一步学习;了解如何使用本指南中的 Project Reactor 库方法,请参阅“将数据写入MongoDB”指南。
更新操作
您可以使用以下方法在 MongoDB 中执行更新操作:
updateOne(),更新匹配搜索条件的第一个文档updateMany(),更新与搜索条件匹配的所有文档
每种更新方法都需要以下参数:
查询过滤文档,用于确定要更新的文档。 有关使用查询筛选器的更多信息,请参阅筛选器部分。
更新文档,指定更新操作符(要执行的更新类型)以及要更改的字段和值。 有关更新操作符的更多信息,请参阅更新操作符部分。
筛选器
每种更新方法都需要一个查询筛选条件,它指定了搜索条件,以确定选择哪些文档进行更新。为了便于创建过滤器对象,驱动程序提供了提供过滤器条件辅助工具的 Filters 类。
要查看 Filters 助手列表,请参阅 Filters API文档。有关查询筛选器的更多信息,请参阅MongoDB Server手册中的查询筛选器文档部分。
更新操作符
要更改文档中的字段, MongoDB提供了更新操作符。要使用更新操作符指定要执行的修改,请创建更新文档。为了便于创建更新文档,驱动程序提供了包含过滤器条件辅助工具方法的 Updates 辅助类。
重要
_id字段不可变,因此您无法更改文档中_id字段的值。
要学习;了解有关更新操作符的更多信息,请参阅服务器手册中的更新操作符。
更新一个文档
要更新MongoDB集合中的单个文档,请调用 updateOne() 方法并传递查询筛选条件和更新操作符。然后,将 updateOne() 结果传递给 Mono 中的静态 Mono.from() 方法。 Mono 是 Project Reactor 库中的一个类。在Java Reactive Streams 中,驱动程序方法会返回 Publisher 冷实例,这意味着除非您订阅返回的 Publisher,否则不会发生相应的操作。本指南使用 项目 Reactor 库来使用它们。要学习;了解有关Mono 的更多信息,请参阅 项目 Reactor 文档中的 Mono。
以下示例使用updateOne()方法将匹配文档的name值从"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,否则不会发生相应的操作。本指南使用 项目 Reactor 库来使用它们。要学习;了解有关Mono 的更多信息,请参阅 项目 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 Server 手册中的模式验证。 |
| 指定对结果进行排序时要使用的语言排序规则类型。 有关更多信息,请参阅 MongoDB Server 手册中的排序规则。 |
| |
| |
| |
| |
| |
| 设置要应用操作的排序条件。 如果多个文档与您传递给 |
| 指定在没有文档与查询筛选器匹配的情况下,更新操作是否执行更新或插入操作。 有关更多信息,请参阅 MongoDB Server 手册中的upsert 语句。 |
更新或插入示例
upsert 操作会更新与查询过滤匹配的文档;如果没有与查询过滤匹配的文档,则会插入新文档。
以下代码使用 updateMany() 方法查找 borough字段值为 "Manhattan" 的所有文档。然后,它将这些文档中的 borough 值更新为 "Manhattan (north)"。由于 upsert 选项设立为 true,因此,如果查询过滤与任何现有文档都不匹配, Java Reactive Streams驾驶员将插入一个新文档。该示例返回与查询过滤匹配的文档数以及通过更新或插入(upsert)操作修改的文档数。
Bson filter = Filters.eq("borough", "Manhattan"); Bson update = Updates.set("borough", "Manhattan (north)"); UpdateOptions options = new UpdateOptions().upsert(true); Publisher<UpdateResult> updateManyPublisher = restaurants.updateMany(filter, update, options); UpdateResult result = Mono.from(updateManyPublisher).block(); System.out.println("Matched: " + result.getMatchedCount() + ", Modified: " + result.getModifiedCount() + ", Upserted ID: " + result.getUpsertedId());
Matched: 10259, Modified: 10259, Upserted ID: null
返回值
updateOne()和updateMany()方法各自返回一个UpdateResult对象。 UpdateResult类型包含以下实例方法:
方法 | 说明 |
|---|---|
| 与查询筛选器匹配的文档数量,无论已更新文档的数量如何。 |
| 更新操作修改的文档数。 如果更新后的文档与原始文档相同,则不计入此计数。 |
| 如果驱动程序执行了更新或插入,则为数据库中已更新或插入的文档的 ID。 否则 |
| 如果更新已确认,则返回 true。 |
更多信息
有关更新操作符的更多信息,请参阅MongoDB Server手册中的更新操作符。
有关使用Java Reactive Streams驾驶员插入文档的可运行代码示例,请参阅增删改查操作指南。
API 文档
要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: