从游标中访问数据
概述
在本指南中,您可以使用 Java Reactive Streams 驱动程序学习如何通过使用游标访问数据。
游标是一种机制,通过可迭代批次返回读操作的结果。由于游标在任何给定时间只保存文档的子集,因此游标可以减少内存消耗和网络带宽使用。
在 Java Reactive Streams 驱动程序中,一些流由游标支持。这些底层游标中使用的批次大小取决于对 Publisher
的 Subscription
请求。FindPublisher.batchSize()
方法可以设置每个底层游标中包含的数据的批次大小。
示例数据
本指南中的示例使用 sample_restaurants.restaurants
集合。Atlas 示例数据集。要了解如何创建免费的 MongoDB Atlas 集群并加载示例数据集,请参阅入门指南。
重要
Project Reactor 库
本指南使用 Project Reactor 库来消费由 Java Reactive Streams 驱动程序方法返回的 Publisher
实例。要了解有关 Project Reactor 库及其使用方法的更多信息,请参阅 入门中的 Reactor 文档。要了解本指南中如何使用 Project Reactor 库方法,请参阅 将数据写入 MongoDB 指南。
迭代访问游标内容
要迭代游标内容,请使用 Flux.from()
方法,如下面的示例所示
FindPublisher<Document> findPublisher = collection.find(); Flux.from(findPublisher) .doOnNext(x -> System.out.println(x.getString("name"))) .blockLast();
检索所有文档
警告
如果查询返回的文档数量和大小超过可用应用内存,您的程序将崩溃。如果您预期结果集很大,请迭代地访问游标。
要从游标中检索所有文档,将游标转换为以下示例中的List
。
FindPublisher<Document> findPublisher = collection.find(Filters.eq("name", "Dunkin' Donuts")); List<Document> resultsList = Flux.from(findPublisher).collectList().block();
可变长游标
当在一个固定长度集合上查询时,您可以使用在客户端耗尽游标结果后仍然保持打开状态的可变长游标。要在固定长度集合上创建可变长游标,请将值CursorType.TailableAwait
传递给FindPublisher对象的cursorType()
方法。
以下示例创建了一个集合上的可变长游标并打印其内容。
FindPublisher<Document> findPublisher = collection.find().cursorType(CursorType.TailableAwait); Flux.from(findPublisher) .doOnNext(System.out::println) .blockLast();
有关可变长游标及其使用的更多信息,请参阅MongoDB服务器手册中的可变长游标指南。
API 文档
要了解更多关于本指南中讨论的任何方法或类型,请参阅以下API文档