替换文档
概述
在本指南中,您将学习如何使用 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文档