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

检索数据

本页内容

  • 概述
  • 示例数据
  • 查找文档
  • 查找单个文档
  • 查找多个文档
  • 修改查找行为
  • 附加信息
  • API 文档

在本指南中,您可以学习如何使用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().first() 构造按磁盘上的自然顺序返回第一个文档。

有关排序的更多信息,请参阅指定要返回的文档指南。

要在集合中查找多个文档,将查询过滤器传递给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 文档

返回

查询