Overview
En esta guía, puede aprender a especificar una consulta mediante el controlador Java Reactive Streams.
Importante
Proyecto Reactor librería
Esta guía utiliza la biblioteca Project Reactor para consumir Publisher 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 Introducción a la documentación de Reactor. Para obtener más información sobre cómo usamos los métodos de la biblioteca de Project Reactor en esta guía, consulte Guía deescritura de datos en MongoDB.
Esta guía utiliza la Flux Publisher clase, que es una Publisher implementación de la biblioteca Project Reactor. En Java Reactive Streams, debe usar Publisher implementaciones para controlar la transmisión de datos en su aplicación. Para obtener más información sobre la Flux clase, consulte Flux en la documentación de Project Reactor.
Puede refinar el conjunto de documentos que devuelve una consulta creando un filtro de consulta. Un filtro de consulta es una expresión que especifica los criterios de búsqueda que MongoDB utiliza para encontrar documentos en una operación de lectura o escritura. En un filtro de consulta, puede solicitar al controlador que busque documentos que coincidan exactamente con su consulta o crear filtros de consulta para expresar criterios de coincidencia más complejos.
Datos de muestra
Los ejemplos de esta guía ejecutan operaciones en una colección llamada fruits que contiene los siguientes documentos:
{ "_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"] }, { "_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"] }, { "_id": 3, "name": "oranges", "qty": 6, "rating": 2, "type": ["naval", "mandarin"] }, { "_id": 4, "name": "pineapple", "qty": 3, "rating": 5, "color": "yellow" },
El siguiente ejemplo de código muestra cómo crear una base de datos y una colección, y luego insertar los documentos de muestra en su colección:
import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; import com.mongodb.ServerApi; import com.mongodb.ServerApiVersion; import com.mongodb.client.result.InsertManyResult; import org.bson.Document; import org.reactivestreams.Publisher; import reactor.core.publisher.Mono; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoDatabase; import com.mongodb.reactivestreams.client.MongoCollection; import java.util.Arrays; import java.util.List; public class QueryDatabase { public static void main(String[] args) { // 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("sample_fruits"); MongoCollection<Document> fruits = database.getCollection("fruits"); Document document1 = new Document("_id", "1") .append("name", "apples") .append("qty", 5) .append("rating", 3) .append("color", "red") .append("type", Arrays.asList("fuji", "honeycrisp")); Document document2 = new Document("_id", "2") .append("name", "bananas") .append("qty", 7) .append("rating", 4) .append("color", "yellow") .append("type", Arrays.asList("cavendish")); Document document3 = new Document("_id", "3") .append("name", "oranges") .append("qty", 6) .append("rating", 2) .append("type", Arrays.asList("naval", "mandarin")); Document document4 = new Document("_id", "4") .append("name", "pineapple") .append("qty", 3) .append("rating", 5) .append("color", "yellow"); List<Document> documents = Arrays.asList(document1, document2, document3, document4); Publisher<InsertManyResult> insertPublisher = fruits.insertMany(documents); Mono.from(insertPublisher).block(); } } }
Coincidencia exacta
Las consultas de valor literal devuelven documentos que coinciden exactamente con el filtro de consulta. Para ello, utilice el método del operador de comparación eq().
El siguiente ejemplo especifica un método operador de comparación eq() como parámetro de filtro de query en el método find(). El código devuelve todos los documentos con un valor de campo color de "yellow".
FindPublisher<Document> findDocPublisher = fruits.find(eq("color", "yellow")); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
Tip
Encuentre todos los documentos
Para buscar todos los documentos de una colección, llame al método find() sin especificar ningún parámetro. El siguiente ejemplo busca todos los documentos de una colección:
FindPublisher<Document> findDocPublisher = fruits.find(); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
Operadores de comparación
Los operadores de comparación evalúan el valor de un campo de documento con respecto a un valor especificado en el filtro de consulta. A continuación, se muestra una lista de métodos comunes de operadores de comparación:
gt(): Mayor quelte():Menor o igual quene():No es igual
Para ver una lista completa de operadores de comparación, consulte la guía Operadores de consulta de comparación en el manual de MongoDB Server.
En el siguiente ejemplo, se especifica un método de operador de comparación gt() en un filtro de query como parámetro para el método find(). El código devuelve todos los documentos cuyo valor de campo rating es mayor que 2.
FindPublisher<Document> findDocPublisher = fruits.find(gt("rating", 2)); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
Operadores lógicos
Los operadores lógicos vinculan documentos mediante la lógica aplicada a los resultados de dos o más conjuntos de expresiones. A continuación, se muestra una lista de métodos de operadores lógicos:
and(), que devuelve todos los documentos que coinciden con las condiciones de todas las cláusulasor(), que devuelve todos los documentos que coinciden con las condiciones de una cláusulanor(), que devuelve todos los documentos que no coinciden con las condiciones de ninguna cláusulanot(), que devuelve todos los documentos que no coinciden con la expresión
Para obtener más información sobre los operadores lógicos, consulte la guía Operadores de consulta lógica en el manual del servidor MongoDB.
El siguiente ejemplo especifica un or() método de operador lógico en un filtro de consulta como parámetro del find() método. El código devuelve todos los documentos con un qty valor de campo mayor que 5 o un color valor de campo igual "yellow" a.
FindPublisher<Document> findDocPublisher = fruits.find( or(gt("qty", 5), eq("color", "yellow"))); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 3, 'name': 'oranges', 'qty': 6, 'rating': 2, 'type': ['naval', 'mandarin']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
Operadores de arreglos
Los operadores de matriz buscan coincidencias de documentos según el valor o la cantidad de elementos en un campo de matriz. A continuación, se muestra una lista de los métodos de operadores de matriz disponibles:
all(), que devuelve documentos con matrices que contienen todos los elementos de la consultaelemMatch(), que devuelve documentos si un elemento en su campo de matriz coincide con todas las condiciones de la consultasize(), que devuelve todos los documentos con matrices de un tamaño especificado
Para obtener más información sobre los operadores de matriz, consulte la guía Operadores de consulta de matriz en el manual del servidor MongoDB.
El siguiente ejemplo especifica un método de operador de matriz size() en un filtro de consulta como parámetro del método find(). El código devuelve todos los documentos con un campo de matriz type que contiene 2 elementos.
FindPublisher<Document> findDocPublisher = fruits.find(size("type", 2)); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 3, 'name': 'oranges', 'qty': 6, 'rating': 2, 'type': ['naval', 'mandarin']}
Operadores de elementos
Los operadores de elementos consultan datos según la presencia o el tipo de campo. A continuación, se muestra una lista de los métodos de operadores de elementos disponibles:
exists(), que devuelve documentos con el campo especificadotype(), que devuelve documentos si un campo es del tipo especificado
Para obtener más información sobre los operadores de elementos, consulte la guía Operadores de consulta de elementos en el manual de MongoDB Server.
El siguiente ejemplo especifica un método de operador de elemento exists() en un filtro de consulta como parámetro del método find(). El código devuelve todos los documentos que tienen un campo color.
FindPublisher<Document> findDocPublisher = fruits.find(exists("color", true)); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
Operadores de evaluación
Los operadores de evaluación devuelven datos basados en evaluaciones de campos individuales o de los documentos de toda la colección. A continuación, se presenta una lista de métodos comunes de operadores de evaluación:
text(), que realiza una consulta de texto sobre los documentosregex(), que devuelve documentos que coinciden con una expresión regular especificadamod(), que realiza una operación de módulo sobre el valor de un campo y devuelve documentos donde el resto es un valor especificado
Para ver una lista completa de operadores de evaluación, consulte la guía Operadores de consulta de evaluación en el manual de MongoDB Server.
El siguiente ejemplo especifica un método de operador de evaluación regex() en un filtro de consulta como parámetro del método find(). El código utiliza una expresión regular para devolver todos los documentos con un valor de campo name que contenga al menos dos caracteres "p" consecutivos.
FindPublisher<Document> findDocPublisher = fruits.find(regex("name", "p{2,}")); Document findResults = Flux.from(findDocPublisher) .doOnNext(System.out::println) .blockLast();
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']} {'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}
Información Adicional
Para obtener más información sobre cómo consultar documentos, consulte la guía Consultar documentos en el manual de MongoDB Server.
Documentación de la API
Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: