对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

查询文档

本页包含Java Reactive Streams驱动程序方法的可复制代码示例,您可以使用这些方法从MongoDB读取数据。

提示

要了解有关此页面上显示的任何方法的更多信息,请参阅每个部分中提供的链接。

要使用此页面中的示例,请将代码示例复制到示例应用程序或您自己的应用程序中。 请务必将代码示例中的所有占位符(例如<connection string> )替换为 MongoDB 部署的相关值。

本指南使用 Project Reactor 库来使用Java Reactive Streams驱动程序方法返回的 Publisher 实例。要学习;了解有关 Project Reactor 库及其使用方法的更多信息,请参阅 Reactor 文档中的入门。

还有其他方法可以使用 Publisher 实例。您可以使用众多替代库(例如 RxJava)之一,也可以直接调用 Publisher.subscribe() 并传递您自己的 Subscriber实施。

本指南中的示例使用 Reactor 中的 Flux.blockLast() 方法订阅Publisher 并区块当前线程,直到 Publisher 达到其终止状态。要学习;了解有关 Reactive Streams 计划的更多信息,请参阅 Reactive Streams。

重要

返回的发布者处于冷状态

Java Reactive Streams驱动程序方法返回的所有 Publisher 实例都是冷的,这意味着除非您订阅返回的 Publisher,否则不会发生相应的操作。我们建议仅订阅返回的 Publisher 一次,因为订阅多次可能会导致错误。

您可以使用以下示例应用程序来测试本页上的代码示例。 要使用示例应用程序,请执行以下步骤:

  1. 在 IDE 中创建一个新的Java项目。

  2. 在Java项目中安装Java Reactive Streams驱动程序。

  3. 在 Java 项目中安装 Project Reactor 库。

  4. 复制以下代码并将其粘贴到名为ReadOperations.java的新Java文件中。

  5. 从此页面复制代码示例,并将其粘贴到文件中的指定行。

import com.mongodb.MongoException;import com.mongodb.ConnectionString;import com.mongodb.MongoClientSettings;import com.mongodb.ServerApi;import com.mongodb.ServerApiVersion; import com.mongodb.reactivestreams.client.MongoCollection; import org.bson.Document; import com.mongodb.reactivestreams.client.MongoClient;import com.mongodb.reactivestreams.client.MongoClients;import com.mongodb.reactivestreams.client.MongoDatabase;import com.mongodb.reactivestreams.client.FindPublisher;import com.mongodb.reactivestreams.client.DistinctPublisher;import com.mongodb.reactivestreams.client.ChangeStreamPublisher;import reactor.core.publisher.Flux; import java.util.ArrayList;import java.util.Arrays;import java.util.List; import static com.mongodb.client.model.Filters.eq; class ReadOperations { public static void main(String[] args) throws InterruptedException { // Replace the placeholder with your Atlas connection string String uri = "<connection string>"; // Construct a ServerApi instance using the ServerApi.builder() method ServerApi serverApi = ServerApi.builder() .version(ServerApiVersion.V1) .build(); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString(uri)) .serverApi(serverApi) .build(); // Create a new client and connect to the server try (MongoClient mongoClient = MongoClients.create(settings)) { MongoDatabase database = mongoClient.getDatabase("<database name>"); MongoCollection<Document> collection = database.getCollection("<collection name>"); // Start example code here // End example code here } }}

以下示例检索与给定过滤指定的条件相匹配的文档:

FindPublisher<Document> findDocPublisher = collection .find(eq("<field name>", "<value>")).first(); Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();

要学习;了解有关find().first()构造的更多信息,请参阅《检索数据》指南。

以下示例检索与给定过滤指定的条件匹配的所有文档:

FindPublisher<Document> findDocPublisher = collection .find(eq("<field name>", "<value>")); Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();

要了解有关find()方法的更多信息,请参阅检索数据指南。

以下示例返回指定集合中的文档数:

Publisher<Long> countPublisher = collection.countDocuments(); Flux.from(countPublisher) .doOnNext(System.out::println) .blockLast();

要学习;了解有关countDocuments()方法的更多信息,请参阅文档计数指南。

以下示例返回指定集合中与给定过滤指定的条件相匹配的文档数:

Publisher<Long> countPublisher = collection.countDocuments( eq("<field name>", "<value>")); Flux.from(countPublisher) .doOnNext(System.out::println) .blockLast();

要学习;了解有关countDocuments()方法的更多信息,请参阅文档计数指南。

以下示例根据集合元数据返回指定集合中文档的大致数量:

Publisher<Long> countPublisher = collection.estimatedDocumentCount(); Flux.from(countPublisher) .doOnNext(System.out::println) .blockLast();

要学习;了解有关estimatedDocumentCount()方法的更多信息,请参阅文档计数指南。

以下示例返回给定集合中指定字段名称的所有非重复值:

DistinctPublisher<String> distinctPublisher = collection.distinct( "<field name>", <type>.class); Flux.from(distinctPublisher) .doOnNext(System.out::println) .blockLast();

要了解有关distinct()方法的更多信息,请参阅“检索不同字段值”指南。

以下示例为给定集合创建变更流,并打印该集合中的后续变更事件:

ChangeStreamPublisher<Document> changePublisher = collection.watch(); Flux.from(changePublisher) .doOnNext(System.out::println) .blockLast();

要学习;了解有关watch()方法的更多信息,请参阅《监控数据更改》指南。