对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

Update Documents

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

方法
说明

arrayFilters(List<? extends Bson> arrayFilters)

指定更新适用于哪些大量元素。

bypassDocumentValidation(Boolean bypassDocumentValidation)

指定更新操作是否绕过文档验证。 这样,您就可以更新不符合模式验证要求的文档(如果存在)。 有关模式验证的更多信息,请参阅 MongoDB Server 手册中的模式验证

collation(Collation collation)

指定对结果进行排序时要使用的语言排序规则类型。 有关更多信息,请参阅 MongoDB Server 手册中的排序规则

comment(BsonValue comment)

为操作附加 Bson 注释。 有关更多信息,请参阅MongoDB Server手册中的插入命令字段指南。

comment(String comment)

为操作附加 String 注释。 有关更多信息,请参阅MongoDB Server手册中的插入命令字段指南。

hint(Bson hint)

将操作的索引设置为 Bson 值。 有关更多信息,请参阅MongoDB Server手册中的提示声明。

hintString(String hint)

将操作的索引设置为 String 值。 有关更多信息,请参阅MongoDB Server手册中的提示声明。

let(Bson variables)

指定参数名称和值的映射。 值必须是常量或不引用文档字段的闭合表达式。 有关更多信息,请参阅MongoDB Server手册中的 let声明。

sort(Bson sort)

设置要应用操作的排序条件。 如果多个文档与您传递给 updateOne() 方法的查询过滤匹配,则该操作会更新第一个结果。 您可以设立此选项,对匹配的文档应用顺序,从而更好地控制更新哪个文档。

upsert(Boolean upsert)

指定在没有文档与查询筛选器匹配的情况下,更新操作是否执行更新或插入操作。 有关更多信息,请参阅 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类型包含以下实例方法:

方法
说明

getMatchedCount()

与查询筛选器匹配的文档数量,无论已更新文档的数量如何。

getModifiedCount()

更新操作修改的文档数。 如果更新后的文档与原始文档相同,则不计入此计数。

getUpsertedId()

如果驱动程序执行了更新或插入,则为数据库中已更新或插入的文档的 ID。 否则null

wasAcknowledged()

如果更新已确认,则返回 true。

有关更新操作符的更多信息,请参阅MongoDB Server手册中的更新操作符

有关使用Java Reactive Streams驾驶员插入文档的可运行代码示例,请参阅增删改查操作指南。

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档: