检索数据
概述
在本指南中,您可以学习如何使用MongoDB Java Reactive Streams Driver通过读取操作从MongoDB集合中检索数据。
示例数据
本指南中的示例使用sample_restaurants.restaurants
集合,来自Atlas 示例数据集。要了解如何创建免费的MongoDB Atlas集群并加载数据集,请参阅入门.
重要
Project Reactor 库
本指南使用Project Reactor库来消费由Java Reactive Streams driver方法返回的Publisher
实例。要了解更多关于Project Reactor库及其使用方法,请参阅入门指南。要了解更多关于本指南中如何使用Project Reactor库方法,请参阅写入MongoDB数据指南。
查找文档
Java 反应式流驱动程序包括一个用于从集合中检索文档的方法:find()
。
此方法接受一个 查询过滤器 并返回一个或多个匹配的文档。查询过滤器是一个对象,用于指定您在查询中要检索的文档。
有关查询过滤器的更多信息,请参阅指定查询指南。
查找单个文档
要在一个集合中查找单个文档,将 first()
方法链到您的 find()
方法调用,并将一个查询过滤器传递给 find()
方法调用,该过滤器指定了您要查找的文档的准则。如果多个文档与查询过滤器匹配,则 find().first()
构造返回检索结果中的第一个匹配文档。如果没有文档与查询过滤器匹配,则构造返回 None
。
技巧
当您知道只有一个匹配的文档,或者您只对第一个匹配项感兴趣时,find().first()
构造非常有用。
以下示例使用 find().first()
构造来查找第一个字段为 "cuisine"
的值为 "Bakery"
的文档。
Publisher<Document> findDocPublisher = restaurants.find( eq("cuisine", "Bakery")).first(); Mono.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
有关排序的更多信息,请参阅指定要返回的文档指南。
查找多个文档
要在集合中查找多个文档,将查询过滤器传递给find()
方法,以指定您要检索的文档的准则。
以下示例使用find()
方法查找所有“cuisine”字段值为“Spanish”的文档。
FindPublisher<Document> findDocPublisher = restaurants.find( eq("cuisine", "Spanish")); Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
注意
查找所有文档
要查找集合中的所有文档,请将find()
方法传递无参数
Publisher<Document> findAllPublisher = restaurants.find(); Flux.from(findAllPublisher) .doOnNext(System.out::println) .blockLast();
修改查找行为
您可以通过将其他方法链接到find()
方法来修改其行为。以下表格描述了一些常用的方法
参数 | 描述 |
---|---|
batchSize(int batchSize) | 限制在给定时间内保持的文档数量。有关游标的更多信息,请参阅MongoDB服务器文档中的游标。 |
collation(Collation collation) | 设置 collation 选项为 Collation 类的实例。 |
comment(String comment) | 将字符串附加到查询。这可以帮助您在服务器日志和配置文件数据中跟踪和解释操作。有关查询注释的更多信息,请参阅$comment 页面。 |
hint(Bson hint) | 获取或设置用于扫描文档的索引。有关更多信息,请参阅MongoDB服务器手册中的hint 语句。 |
maxTime(long maxTime, TimeUnit timeUnit) | 设置此操作在服务器上的最大执行时间。如果超出此时间,Java Reactive Streams 驱动程序将中止操作并引发一个 ExecutionTimeout 。 |
以下示例使用 find()
方法查找所有“cuisine
”字段值为“意大利
”的文档,并设置最大执行时间为10秒。
FindPublisher<Document> findDocPublisher = restaurants.find( eq("cuisine", "Italian")).maxTime(10L, TimeUnit.SECONDS); Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
有关可用参数的完整列表,请参阅 API 文档 中的 FindPublisher
接口。
更多信息
有关查询过滤器的更多信息,请参阅指定查询指南。
有关使用 Java Reactive Streams 驱动程序检索文档的代码示例,请参阅 从 MongoDB 读取数据 指南。
API 文档
要了解本指南中讨论的任何方法或类型,请参阅以下 API 文档