文档菜单
文档首页
/ / /
Java反应式流驱动程序
/

更新文档

在本页

  • 概述
  • 示例数据
  • 更新操作
  • 过滤器
  • 更新运算符
  • 更新单个文档
  • 更新多个文档
  • 自定义更新操作
  • 示例
  • 返回值
  • 其他信息
  • API 文档

在此指南中,您可以了解如何使用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 类中使用以下可选方法来修改更新操作

方法
描述
arrayFilters(List<? extends Bson> arrayFilters)
指定更新应用于哪些数组元素。
bypassDocumentValidation(Boolean bypassDocumentValidation)
指定更新操作是否绕过文档验证。这允许您更新不满足模式验证要求的文档(如果存在)。有关模式验证的更多信息,请参阅 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 文档

返回

插入