As operações de leitura recuperam documentos ou informações sobre documentos de uma collection. Você pode especificar um filtro para recuperar somente os documentos que correspondam à condição do filtro.
Pré-requisitos
Você deve configurar os seguintes componentes para executar os exemplos de código neste guia:
Uma coleção
test.restaurantspreenchida com documentos do arquivorestaurants.jsonnos ativos de documentação do Github.As seguintes declarações de importação:
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
Este guia usa as implementações do Subscriber , que são descritas noPrimário de início rápidodo .
Conecte-se a um MongoDB deployment
Primeiro, conecte a um MongoDB deployment e, em seguida, declare e defina as instâncias MongoDatabase e MongoCollection .
O código a seguir se conecta a uma MongoDB deployment standalone em execução em localhost na porta 27017. Em seguida, define a variável database para fazer referência ao banco de dados test e a variável collection para fazer referência à coleção restaurants :
MongoClient mongoClient = MongoClients.create(); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("restaurants");
Para saber mais sobre como se conectar a sistemas do MongoDB, consulte o tutorial Conectar ao MongoDB .
Consultar uma Collection
Para fazer query da coleção, você pode usar o método find() da coleção.
Você pode chamar o método sem argumentos para consultar todos os documentos em uma coleção:
collection.find().subscribe(new PrintDocumentSubscriber());
Ou você pode passar um filtro para fazer query de documentos que correspondam aos critérios do filtro:
collection.find(eq("name", "456 Cookies Shop")) .subscribe(new PrintDocumentSubscriber());
Filtros de query
Para consultar documentos que correspondam a determinadas condições, passe um documento de filtro para o método find() .
Filtro vazio
Para especificar um filtro vazio e corresponder a todos os documentos em uma collection, use um objeto Document vazio:
collection.find(new Document()).subscribe(new PrintDocumentSubscriber());
Dica
Ao usar o método find() , você também pode chamar o método sem passar nenhum objeto de filtro para corresponder a todos os documentos em uma collection.
collection.find().subscribe(new PrintDocumentSubscriber());
Auxiliar de filtros
Para facilitar a criação de documentos de filtro, o driver fornece a classe Filters que fornece métodos auxiliares de condição de filtro.
Esse exemplo de operação de localização inclui uma instância de filtro Document que especifica as seguintes condições:
starso valor do campo é maior ou igual a2e menor que5categoriescampo é igual a"Bakery", ou secategoriesfor um campo de array, contém a string"Bakery"como um elemento
collection.find( new Document("stars", new Document("$gte", 2) .append("$lt", 5)) .append("categories", "Bakery")).subscribe(new PrintDocumentSubscriber());
O exemplo a seguir especifica a mesma condição de filtro usando os métodos auxiliares Filters :
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .subscribe(new PrintDocumentSubscriber());
Para visualizar uma lista de operadores de filtro de query, consulte Operadores de Query e Projeção no manual do Servidor. Para ver uma lista de auxiliares do Filters, consulte a documentação da API de filtros.
Encontrar editor
O método find() retorna uma instância da interface FindPublisher . A interface fornece vários métodos que você pode encadear ao método find() para modificar a saída ou o comportamento da query, como sort() ou projection(), bem como para iterar os resultados por meio do método subscribe() .
Projeções
Por padrão, as queries no MongoDB retornam todos os campos em documentos correspondentes. Para especificar os campos a serem retornados nos documentos correspondentes, você pode especificar um documento de projeção.
Este exemplo de operação de busca inclui uma projeção Document que especifica que os documentos correspondentes incluem somente os campos name, stars e 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 a criação de documentos de projeção, o driver fornece a classe Projections .
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .projection(fields(include("name", "stars", "categories"), excludeId())) .subscribe(new PrintDocumentSubscriber());
No documento de projeção, você também pode especificar uma expressão de projeção usando um operador de projeção.
Para visualizar um exemplo que utiliza o método Projections.metaTextScore(), consulte o tutorial Atlas Searchde Texto .
Tipos
Para classificar documentos, passe um documento de especificação de classificação para o método FindPublisher.sort() . O driver fornece métodos auxiliares Sorts para facilitar a criação do documento de especificação de classificação.
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .sort(Sorts.ascending("name")) .subscribe(new PrintDocumentSubscriber());
Classificar com projeções
Os métodos FindPublisher em si retornam objetos FindPublisher e, como tal, você pode anexar vários métodos FindPublisher ao 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 uma operação de localização, chame o método FindPublisher.explain() :
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .explain() .subscribe(new PrintDocumentSubscriber());
readPreference
Para operações de leitura em conjuntos de réplicas ou clusters fragmentados, você pode configurar a preferência de leitura nos seguintes níveis:
Em um
MongoClientdas seguintes maneiras:Ao criar uma instância do
MongoClientSettings:MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString("mongodb://host1,host2")) .readPreference(ReadPreference.secondary()) .build()); Ao criar uma instância do
ConnectionString:MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017/?readPreference=secondary");
Em um
MongoDatabaseusando o métodowithReadPreference():MongoDatabase database = mongoClient.getDatabase("test") .withReadPreference(ReadPreference.secondary()); Em um
MongoCollectionusando o métodowithReadPreference():MongoCollection<Document> collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.secondary());
MongoDatabase e MongoCollection instâncias são imutáveis. Chamar withReadPreference() em uma instância MongoDatabase ou MongoCollection existente retorna uma nova instância e não afeta a instância na qual o método é chamado.
No exemplo a seguir, a instância collectionWithReadPref tem a preferência de leitura de primaryPreferred , enquanto a preferência de leitura do collection não é afetada:
MongoCollection<Document> collectionWithReadPref = collection.withReadPreference(ReadPreference.primaryPreferred());
Preocupação de leitura
Para operações de leitura em conjuntos de réplicas ou clusters fragmentados, os aplicativos podem configurar a read concern nos seguintes níveis:
Em um
MongoClientdas seguintes maneiras:Ao criar uma instância do
MongoClientSettings:MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString("mongodb://host1,host2")) .readConcern(ReadConcern.MAJORITY) .build()); Ao criar uma instância do
ConnectionString:MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017/?readConcernLevel=majority");
Em um
MongoDatabaseusando o métodowithReadConcern():MongoDatabase database = mongoClient.getDatabase("test") .withReadConcern(ReadConcern.MAJORITY); Em um
MongoCollectionusando o métodowithReadConcern():MongoCollection<Document> collection = database.getCollection("restaurants") .withReadConcern(ReadConcern.MAJORITY);
MongoDatabase e MongoCollection instâncias são imutáveis. Chamar withReadConcern() em uma instância MongoDatabase ou MongoCollection existente retorna uma nova instância e não afeta a instância na qual o método é chamado.
No exemplo a seguir, a instância collWithReadConcern tem um read concern AVAILABLE , enquanto a read concern do collection não é afetada:
MongoCollection<Document> collWithReadConcern = collection.withReadConcern(ReadConcern.AVAILABLE);
Você pode construir instâncias do MongoClientSettings, MongoDatabase ou MongoCollection para incluir combinações de read concerns, read preferences e write concerns.
Por exemplo, o seguinte código define todos os três no nível da collection:
collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.primary()) .withReadConcern(ReadConcern.MAJORITY) .withWriteConcern(WriteConcern.MAJORITY);