Ler operações
Nesta página
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
test.restaurants
coleção preenchida com documentos dorestaurants.json
arquivo na documentação de ativos 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:
stars
o valor do campo é maior ou igual a2
e menor que5
categories
campo é igual a"Bakery"
, ou secategories
for 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 MongoDB. Para ver uma lista de Filters
auxiliares do , 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
MongoClient
das 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
MongoDatabase
usando o métodowithReadPreference()
:MongoDatabase database = mongoClient.getDatabase("test") .withReadPreference(ReadPreference.secondary()); Em um
MongoCollection
usando 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
MongoClient
das 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
MongoDatabase
usando o métodowithReadConcern()
:MongoDatabase database = mongoClient.getDatabase("test") .withReadConcern(ReadConcern.MAJORITY); Em um
MongoCollection
usando 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);