Overview
Esta página contiene ejemplos de código copiables de métodos del controlador Java Reactive Streams que puedes usar para leer datos de MongoDB.
Tip
Para obtener más información sobre cualquiera de los métodos que se muestran en esta página, consulte el enlace proporcionado en cada sección.
Para utilizar un ejemplo de esta página, copie el ejemplo de código en el
Aplicación de ejemplo o su propia aplicación. Asegúrese de reemplazar todos los marcadores de posición en los ejemplos de código, como <connection string>, con los valores relevantes para su implementación de MongoDB.
Implementación del Proyecto Reactor
Esta guía utiliza la biblioteca Project Reactor para consumir Publisher las instancias devueltas por los métodos del controlador Java Reactive Streams. Para obtener más información sobre la biblioteca Project Reactor y cómo usarla, consulte la sección "Introducción" en la documentación de Reactor.
También hay otras formas de consumir Publisher instancias. Puedes usar una de las muchas bibliotecas alternativas, como RxJava, o llamar Publisher.subscribe() directamente a y pasar tu propia implementación de Subscriber un.
Los ejemplos de esta guía utilizan el Flux.blockLast() método de Reactor para suscribirse a un Publisher y bloquear el hilo actual hasta que el Publisher alcance su estado terminal. Para obtener más información sobre la iniciativa Reactive Streams, consulte Reactive Streams.
Importante
Los editores que regresaron son fríos
Todas las instancias de Publisher devueltas por los métodos del controlador de Java Reactive Streams son frías, lo que significa que la operación correspondiente no ocurre a menos que se suscriba al Publisher devuelto. Recomendamos suscribirse solo una vez al Publisher devuelto, porque suscribirse más de una vez puede provocar errores.
Aplicación de muestra
Puede utilizar la siguiente aplicación de muestra para probar los ejemplos de código en esta página. Para usar la aplicación de muestra, siga los siguientes pasos:
Crea un nuevo proyecto Java en tu IDE.
Instale el controlador Java Reactive Streams en su proyecto Java.
Instale la biblioteca Project Reactor en su proyecto Java.
Copie el siguiente código y péguelo en un nuevo archivo Java llamado
ReadOperations.java.Copia un ejemplo de código de esta página y pégalo en las líneas especificadas del archivo.
1 import com.mongodb.MongoException; 2 import com.mongodb.ConnectionString; 3 import com.mongodb.MongoClientSettings; 4 import com.mongodb.ServerApi; 5 import com.mongodb.ServerApiVersion; 6 7 import com.mongodb.reactivestreams.client.MongoCollection; 8 9 import org.bson.Document; 10 11 import com.mongodb.reactivestreams.client.MongoClient; 12 import com.mongodb.reactivestreams.client.MongoClients; 13 import com.mongodb.reactivestreams.client.MongoDatabase; 14 import com.mongodb.reactivestreams.client.FindPublisher; 15 import com.mongodb.reactivestreams.client.DistinctPublisher; 16 import com.mongodb.reactivestreams.client.ChangeStreamPublisher; 17 import reactor.core.publisher.Flux; 18 19 import java.util.ArrayList; 20 import java.util.Arrays; 21 import java.util.List; 22 23 import static com.mongodb.client.model.Filters.eq; 24 25 class ReadOperations { 26 public static void main(String[] args) throws InterruptedException { 27 // Replace the placeholder with your Atlas connection string 28 String uri = "<connection string>"; 29 30 // Construct a ServerApi instance using the ServerApi.builder() method 31 ServerApi serverApi = ServerApi.builder() 32 .version(ServerApiVersion.V1) 33 .build(); 34 35 MongoClientSettings settings = MongoClientSettings.builder() 36 .applyConnectionString(new ConnectionString(uri)) 37 .serverApi(serverApi) 38 .build(); 39 40 // Create a new client and connect to the server 41 try (MongoClient mongoClient = MongoClients.create(settings)) { 42 MongoDatabase database = mongoClient.getDatabase("<database name>"); 43 MongoCollection<Document> collection = database.getCollection("<collection name>"); 44 45 // Start example code here 46 47 // End example code here 48 } 49 } 50 }
Encontrar uno
El siguiente ejemplo recupera un documento que coincide con los criterios especificados por el filtro dado:
FindPublisher<Document> findDocPublisher = collection .find(eq("<field name>", "<value>")).first(); Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
Para obtener más información sobre la construcción find().first(), consulte la Guíade recuperación de datos.
Encontrar varios
El siguiente ejemplo recupera todos los documentos que coinciden con los criterios especificados por el filtro dado:
FindPublisher<Document> findDocPublisher = collection .find(eq("<field name>", "<value>")); Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
Para obtener más información sobre el find() método, consulte la guía Recuperar datos.
Contar documentos en una colección
El siguiente ejemplo devuelve el número de documentos en la colección especificada:
Publisher<Long> countPublisher = collection.countDocuments(); Flux.from(countPublisher) .doOnNext(System.out::println) .blockLast();
Para obtener más información sobre el countDocuments() método, consulte la guía Contar documentos.
Contar documentos devueltos de una query
El siguiente ejemplo devuelve la cantidad de documentos en la colección especificada que coinciden con los criterios especificados por el filtro dado:
Publisher<Long> countPublisher = collection.countDocuments( eq("<field name>", "<value>")); Flux.from(countPublisher) .doOnNext(System.out::println) .blockLast();
Para obtener más información sobre el countDocuments() método, consulte la guía Contar documentos.
Recuento estimado de documentos
El siguiente ejemplo devuelve un número aproximado de documentos en la colección especificada según los metadatos de la colección:
Publisher<Long> countPublisher = collection.estimatedDocumentCount(); Flux.from(countPublisher) .doOnNext(System.out::println) .blockLast();
Para obtener más información sobre el estimatedDocumentCount() método, consulte la guía Contar documentos.
Retrieve Distinct Values
El siguiente ejemplo devuelve todos los valores distintos del nombre de campo especificado en una colección determinada:
DistinctPublisher<String> distinctPublisher = collection.distinct( "<field name>", <type>.class); Flux.from(distinctPublisher) .doOnNext(System.out::println) .blockLast();
Para obtener más información sobre el método distinct(), consulta la guía Recuperar Valores Únicos de Campo.
Supervisar los cambios en los datos
El siguiente ejemplo crea un flujo de cambios para una colección determinada e imprime los eventos de cambio posteriores en esa colección:
ChangeStreamPublisher<Document> changePublisher = collection.watch(); Flux.from(changePublisher) .doOnNext(System.out::println) .blockLast();
Para obtener más información sobre el watch() método, consulte la guía Monitorear cambios en los datos.