Las operaciones de lectura recuperan documentos o información sobre documentos de una colección. Puedes especificar un filtro para recuperar solo los documentos que cumplan con la condición del filtro.
Requisitos previos
Debe configurar los siguientes componentes para ejecutar los ejemplos de código de esta guía:
A
test.restaurantsColección rellenada con documentos delrestaurants.jsonarchivo en los activos de documentación de GitHub.Las siguientes declaraciones de importación:
import com.mongodb.*; import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoCollection; import com.mongodb.reactivestreams.client.MongoDatabase; import com.mongodb.client.model.Projections; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Sorts; import java.util.Arrays; import org.bson.Document; import static com.mongodb.client.model.Filters.*; import static com.mongodb.client.model.Projections.*;
Importante
Esta guía utiliza las implementaciones Subscriber, que se describen en la Manual de inicio rápido.
Conectarse a una implementación de MongoDB
Primero, conéctese a una implementación de MongoDB, luego declare y defina las instancias MongoDatabase y MongoCollection.
El siguiente código se conecta a una implementación independiente de MongoDB que se ejecuta en localhost, en el puerto 27017. Luego, define la variable database para referirse a la base de datos test y la variable collection para referirse a la colección restaurants:
MongoClient mongoClient = MongoClients.create(); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("restaurants");
Para obtener más información sobre cómo conectarse a implementaciones de MongoDB, consulte el tutorial Conectarse a MongoDB.
Consultar una colección
Para consultar la colección, puede utilizar el método find() de la colección.
Puede llamar al método sin ningún argumento para consultar todos los documentos de una colección:
collection.find().subscribe(new PrintDocumentSubscriber());
O bien, puede pasar un filtro para consultar documentos que coincidan con los criterios del filtro:
collection.find(eq("name", "456 Cookies Shop")) .subscribe(new PrintDocumentSubscriber());
Filtros de consulta
Para consultar documentos que coincidan con determinadas condiciones, pase un documento de filtro al método find().
Filtro vacío
Para especificar un filtro vacío y hacer coincidir todos los documentos de una colección, utilice un objeto Document vacío:
collection.find(new Document()).subscribe(new PrintDocumentSubscriber());
Tip
Al utilizar el método find(), también puede llamar al método sin pasar ningún objeto de filtro para que coincida con todos los documentos de una colección.
collection.find().subscribe(new PrintDocumentSubscriber());
Asistente de filtros
Para facilitar la creación de documentos de filtro, el controlador proporciona la clase Filters que proporciona métodos auxiliares de condición de filtro.
Esta operación de búsqueda de ejemplo incluye una instancia de filtro Document que especifica las siguientes condiciones:
starsEl valor del campo es mayor o igual a2y menor que5categoriesEl campo es igual a"Bakery", o sicategorieses un campo de matriz, contiene la cadena"Bakery"como elemento
collection.find( new Document("stars", new Document("$gte", 2) .append("$lt", 5)) .append("categories", "Bakery")).subscribe(new PrintDocumentSubscriber());
El siguiente ejemplo especifica la misma condición de filtro utilizando los métodos auxiliares Filters:
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .subscribe(new PrintDocumentSubscriber());
Para ver una lista de operadores de filtro de consulta, consulte Operadores de consulta y proyección en el manual del servidor. Para ver una lista de los Filters ayudantes, consulte la documentación de la API de filtros.
FindPublisher
El método find() devuelve una instancia de la interfaz FindPublisher. Esta interfaz proporciona varios métodos que se pueden encadenar al método find() para modificar la salida o el comportamiento de la consulta, como sort() o projection(), así como para iterar los resultados mediante el método subscribe().
Proyecciones
De forma predeterminada, las consultas en MongoDB devuelven todos los campos de los documentos coincidentes. Para especificar los campos que se devolverán en los documentos coincidentes, puede especificar un documento de proyección.
Este ejemplo de operación de búsqueda incluye una proyección Document que especifica que los documentos coincidentes incluyen solo los campos name, stars y categories:
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .projection(new Document("name", 1) .append("stars", 1) .append("categories",1) .append("_id", 0)) .subscribe(new PrintDocumentSubscriber());
Para facilitar la creación de documentos de proyección, el controlador proporciona la clase Projections.
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .projection(fields(include("name", "stars", "categories"), excludeId())) .subscribe(new PrintDocumentSubscriber());
En el documento de proyección, también puede especificar una expresión de proyección utilizando un operador de proyección.
Para ver un ejemplo que utiliza el Projections.metaTextScore() método, consulte el tutorial de búsqueda de texto.
Ordena
Para ordenar documentos, pase un documento de especificación de ordenación al método FindPublisher.sort(). El controlador proporciona métodos auxiliares Sorts para facilitar la creación del documento de especificación de ordenación.
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .sort(Sorts.ascending("name")) .subscribe(new PrintDocumentSubscriber());
Ordenar con proyecciones
Los métodos FindPublisher en sí mismos devuelven objetos FindPublisher y, como tal, puedes agregar múltiples métodos FindPublisher al método find():
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .sort(Sorts.ascending("name")) .projection(fields(include("name", "stars", "categories"), excludeId())) .subscribe(new PrintDocumentSubscriber());
Explicar
Para explicar una operación de búsqueda, llame al método FindPublisher.explain():
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .explain() .subscribe(new PrintDocumentSubscriber());
preferencia de lectura
Para operaciones de lectura en conjuntos de réplicas o clústeres fragmentados, puede configurar la preferencia de lectura en los siguientes niveles:
De una forma
MongoClientde las siguientes maneras:Al crear una instancia
MongoClientSettings:MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString("mongodb://host1,host2")) .readPreference(ReadPreference.secondary()) .build()); Al crear una instancia
ConnectionString:MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017/?readPreference=secondary");
En un
MongoDatabaseutilizando el métodowithReadPreference():MongoDatabase database = mongoClient.getDatabase("test") .withReadPreference(ReadPreference.secondary()); En un
MongoCollectionutilizando el métodowithReadPreference():MongoCollection<Document> collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.secondary());
MongoDatabase Las instancias MongoCollection y withReadPreference() son inmutables. Llamar a en una instancia MongoDatabase o MongoCollection existente devuelve una nueva instancia y no afecta a la instancia en la que se llama el método.
En el siguiente ejemplo, la instancia collectionWithReadPref tiene la preferencia de lectura de primaryPreferred mientras que la preferencia de lectura de collection no se ve afectada:
MongoCollection<Document> collectionWithReadPref = collection.withReadPreference(ReadPreference.primaryPreferred());
readConcern
Para las operaciones de lectura en conjuntos de réplicas o clústeres fragmentados, las aplicaciones pueden configurar la preocupación de lectura en los siguientes niveles:
De una forma
MongoClientde las siguientes maneras:Al crear una instancia
MongoClientSettings:MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString("mongodb://host1,host2")) .readConcern(ReadConcern.MAJORITY) .build()); Al crear una instancia
ConnectionString:MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017/?readConcernLevel=majority");
En un
MongoDatabaseutilizando el métodowithReadConcern():MongoDatabase database = mongoClient.getDatabase("test") .withReadConcern(ReadConcern.MAJORITY); En un
MongoCollectionutilizando el métodowithReadConcern():MongoCollection<Document> collection = database.getCollection("restaurants") .withReadConcern(ReadConcern.MAJORITY);
MongoDatabase Las instancias MongoCollection y withReadConcern() son inmutables. Llamar a en una instancia MongoDatabase o MongoCollection existente devuelve una nueva instancia y no afecta a la instancia en la que se llama el método.
En el siguiente ejemplo, la instancia collWithReadConcern tiene una preocupación de lectura AVAILABLE mientras que la preocupación de lectura de collection no se ve afectada:
MongoCollection<Document> collWithReadConcern = collection.withReadConcern(ReadConcern.AVAILABLE);
Puede crear instancias MongoClientSettings, MongoDatabase o MongoCollection para incluir combinaciones de inquietudes de lectura, preferencias de lectura e inquietudes de escritura.
Por ejemplo, el siguiente código establece los tres en el nivel de colección:
collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.primary()) .withReadConcern(ReadConcern.MAJORITY) .withWriteConcern(WriteConcern.MAJORITY);