替换文档
概述
在本指南中,您将学习如何使用 Java 反应式流驱动程序通过执行 替换操作 来替换 MongoDB 集合中的一个文档。
替换操作使用您指定的新字段和值替换 MongoDB 集合中的一个文档。您可以通过使用replaceOne() 方法来执行替换操作。
示例数据
本指南中的示例使用来自Atlas 示例数据集的 sample_restaurants.restaurants 集合。.
要了解如何创建免费的 MongoDB Atlas 集群并加载示例数据集,请参阅入门教程。
重要
项目 Reactor 库
本指南使用 Project Reactor 库来消费由 Java 反应式流驱动方法返回的 Publisher 实例。要了解有关 Project Reactor 库及其使用方法,请参阅 Reactor 文档中的 入门指南。要了解本指南中如何使用 Project Reactor 库的方法,请参阅 将数据写入 MongoDB 指南。
替换操作
您可以通过在 MongoCollection 实例上使用 replaceOne() 方法来执行替换操作。此方法从第一个符合搜索条件的文档中删除所有字段(除了 _id 字段),然后将您指定的字段和值添加到空文档中。
必需参数
replaceOne() 方法需要以下参数
查询过滤器 文档,用于确定哪些文档要替换。
有关查询过滤器的更多信息,请参阅指定查询指南。
替换文档,该文档指定了新文档中要插入的字段和值。
替换示例
要替换MongoDB集合中的单个文档,调用replaceOne()方法并传入查询过滤器文档和替换文档作为参数。然后,将replaceOne()结果传递给来自Mono的静态Mono.from()方法。Mono是来自Project Reactor库的一个类。在Java Reactive Streams中,驱动程序方法返回冷Publisher实例,这意味着除非您订阅返回的Publisher,否则相应的操作不会发生。本指南使用Project Reactor库来消费它们。有关Mono的更多信息,请参阅Project Reactor文档中的Mono。
以下示例使用replaceOne()方法替换具有name字段值为"Pizza Town"的文档的字段和值。replaceOne()方法将原始文档替换为一个具有name字段值为"Mongo's Pizza"和cuisine字段值为"Pizza"的文档。
Publisher<UpdateResult> replacePublisher = restaurants.replaceOne( eq("name", "Pizza Town"), new Document().append("name", "Mongo's Pizza") .append("cuisine", "Pizza")); Mono.from(replacePublisher).block();
修改替换行为
您可以通过调用一个选项方法来可选地修改 replaceOne() 方法的行为。ReplaceOptions 类提供了修改 replaceOne() 方法行为的方法。要使用 ReplaceOptions 类,构造该类的一个新实例,然后调用一个或多个其方法以修改替换操作。您可以将这些方法调用链接起来。要修改替换操作的行为,将类实例和链接的方法调用作为最后一个参数传递给 replaceOne() 方法。
您可以在 ReplaceOptions 类中使用以下方法来修改 replaceOne() 方法。
方法 | 描述 |
|---|---|
bypassDocumentValidation(Boolean bypass) | 指定是否绕过文档验证的替换操作。这允许您更新不符合模式验证要求的文档(如果有的话)。有关模式验证的更多信息,请参阅 MongoDB 服务器手册中的 模式验证。 |
collation(Collation collation) | 指定在排序结果时使用的语言排序类型。有关更多信息,请参阅 MongoDB 服务器手册中的 排序。 |
comment(BsonValue comment) | 将 BsonValue 注释附加到操作。有关更多信息,请参阅 MongoDB 服务器手册中的 插入命令字段 指南。 |
comment(String comment) | 将 String 注释附加到操作。有关更多信息,请参阅 MongoDB 服务器手册中的 插入命令字段 指南。 |
hint(Bson hint) | 将操作索引设置为 Bson 值。有关更多信息,请参阅 MongoDB 服务器手册中的 提示语句。 |
hintString(String hint) | 将操作索引设置为 String 值。有关更多信息,请参阅 MongoDB 服务器手册中的 提示语句。 |
let(Bson variables) | 指定参数名称和值的映射。值必须是常数或封闭表达式,不能引用文档字段。更多信息,请参阅 MongoDB 服务器手册中的 let 语句。 |
upsert(Boolean upsert) | 指定如果查询过滤器没有匹配任何文档,替换操作是否执行 upsert 操作。更多信息,请参阅 MongoDB 服务器手册中的 upsert 语句。 |
修改替换示例
以下代码使用 replaceOne() 方法替换 restaurants 集合中的一个文档。它还设置了 upsert(true) 选项,以便如果查询过滤器不匹配任何现有文档,则驱动程序插入新文档。
Publisher<UpdateResult> replacePublisher = restaurants.replaceOne( eq("name", "Food Town"), new Document().append("name", "Food World") .append("cuisine", "Mixed"), new ReplaceOptions().upsert(true)); Mono.from(replacePublisher).block();
返回值
replaceOne() 方法返回一个 UpdateResult 对象。使用以下来自 UpdateResult 类型的 UpdateResult 方法来访问相应的信息
属性 | 描述 |
|---|---|
getMatchedCount() | 匹配查询过滤器的文档数量,无论替换了多少个。 |
getModifiedCount() | 替换操作修改的文档数量。如果替换的文档与原始文档相同,则不包括在此计数中。 |
getUpsertedId() | 如果驱动程序执行了 upsert,则插入到数据库中的文档的 ID。如果没有插入任何文档,此值是 null。 |
wasAcknowledged() | 替换的确认。 |
附加信息
有关使用Java反应流驱动程序替换文档的可运行代码示例,请参阅写入MongoDB数据指南。
API文档
要了解本指南中讨论的任何方法或类型,请参阅以下API文档