Docs Menu
Docs Home
/ /
Tutorials
/ / /

Operaciones de lectura

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.

Debe configurar los siguientes componentes para ejecutar los ejemplos de código de esta guía:

  • A test.restaurants Colección rellenada con documentos del restaurants.json archivo 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.

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.

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());

Para consultar documentos que coincidan con determinadas condiciones, pase un documento de filtro al método find().

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());

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:

  • stars El valor del campo es mayor o igual a 2 y menor que 5

  • categories El campo es igual a "Bakery", o si categories es 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.

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().

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.

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());

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());

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());

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 MongoClient de 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 MongoDatabase utilizando el método withReadPreference():

    MongoDatabase database = mongoClient.getDatabase("test")
    .withReadPreference(ReadPreference.secondary());
  • En un MongoCollection utilizando el método withReadPreference():

    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());

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 MongoClient de 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 MongoDatabase utilizando el método withReadConcern():

    MongoDatabase database = mongoClient.getDatabase("test")
    .withReadConcern(ReadConcern.MAJORITY);
  • En un MongoCollection utilizando el método withReadConcern():

    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);

Volver

Cree índices

En esta página