Menu Docs
Página inicial do Docs
/ / /
Driver de sincronização Java
/ / /

Acessar dados de um cursor

Nesta página

  • Visão geral
  • Métodos de terminal
  • Primeiro
  • Número de resultados
  • Into
  • Cursor
  • explicar
  • Padrões de uso
  • Iteração funcional
  • Iteração condicional
  • Limpeza do cursor
  • Fechar
  • Tente com a Declaração de Recursos

Neste guia, você pode aprender como acessar dados usando um cursor com o driver MongoDB Java.

Um cursor é um mecanismo que permite que uma aplicação itere sobre os resultados do reconhecimento de data center enquanto mantém apenas um subconjunto deles na memória em determinado momento. O driver usa cursores em operações de leitura que correspondem a vários documentos para devolvê-los em lotes, em vez de devolvê-los todos de uma só vez.

Esta página utiliza um método de iniciação, find() para mostrar como acessar dados de um FindIterable.

Observação

As seguintes formas de acessar e armazenar dados se aplicam a outros iteráveis, como um AggregateIterable.

O método find() cria e retorna uma instância de um FindIterable. Um FindIterable permite que você navegue pelos documentos correspondentes aos seus critérios do Atlas Search e especifique ainda mais quais documentos ver, definindo parâmetros por meio de métodos.

Os métodos do Terminal executam uma operação no MongoDB deployment após configurar todos os parâmetros de uma instância do Iterable que controla a operação.

Use o método first() para recuperar o primeiro documento nos resultados da sua query:

FindIterable<Document> iterable = collection.find();
System.out.println(iterable.first());

Esse método geralmente é usado quando o filtro de query corresponderá a um documento, como ao filtrar por um índice exclusivo.

Utilize o método available() para recuperar o número de resultados presentes localmente sem bloquear:

MongoCursor<Document> cursor = collection.find().cursor();
System.out.println(cursor.available());

O método retorna 0 se o aplicativo já tiver iterado por todos os documentos no cursor ou se o cursor estiver fechado.

Utilize o método into() para armazenar os resultados da query em um List:

List<Document> results = new ArrayList<>();
FindIterable<Document> iterable = collection.find();
iterable.into(results);
System.out.println(results);

Esse método geralmente é usado quando o filtro de query retorna um pequeno número de documentos que cabem na memória disponível.

Use o método cursor() para iterar os documentos obtidos e garantir que o cursor feche em caso de encerramento antecipado:

MongoCursor<Document> cursor = collection.find().cursor();

Para obter mais informações sobre como garantir que um cursor seja fechado, consulte a seção de limpeza do cursor.

Use o método explain() para visualizar informações sobre como o MongoDB executa sua operação.

O método explain() retorna planos de execução e estatísticas de desempenho. Um plano de execução é uma maneira em potencial de o MongoDB concluir uma operação. O método explain() fornece ambos o plano vencedor (o plano do MongoDB executado) e planos rejeitados.

Você pode especificar o nível de detalhes da sua explicação passando um nível de verbosidade para o método explain().

A tabela a seguir mostra todos os níveis de verbosidade para explicações e seus casos de uso pretendidos:

Nível de verbosidade
Caso de uso
ALL_PLANS_EXECUTIONS
Você deseja saber qual plano o MongoDB escolherá para executar sua query.
EXECUTION_STATS
Você quer saber se sua query está tendo um bom desempenho.
QUERY_PLANNER
Você tem um problema com sua query e deseja o máximo de informações possível para diagnosticar o problema.

O exemplo a seguir imprime a representação JSON do plano vencedor para estágios de agregação que produzem planos de execução:

Document explanation = collection.find().explain(ExplainVerbosity.EXECUTION_STATS);
List<String> keys = Arrays.asList("queryPlanner", "winningPlan");
System.out.println(explanation.getEmbedded(keys, Document.class).toJson());

O trecho de código anterior produz o seguinte resultado:

{ "stage": "COLLSCAN", "direction": "forward" }

Para obter mais informações sobre a operação de explicação, consulte as seguintes entradas manuais do servidor:

Para obter mais informações sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:

Um MongoCursor e FindIterable permitem acessar os resultados da query um documento de cada vez, abstraindo a lógica de rede e de cache.

Passe uma função para o método forEach() de um FindIterable para iterar pelos resultados em um estilo funcional:

FindIterable<Document> iterable = collection.find();
iterable.forEach(doc -> System.out.println(doc.toJson()));

Importante

Os métodos de início retornam objetos que implementam a interface Iterable , o que permite iterar por eles usando métodos iteradores. Às vezes, usamos um loop for- cada aprimorado para iterar os resultados:

for (Document cursor : collection.find()) {
...
}

Iterar dessa forma não é preferível porque, se uma exceção for lançada antes da conclusão do loop, o cursor não será fechado. Usar um MongoCursor nos permite garantir que o cursor feche como mostrado na seção de limpeza do cursor.

Use o método hasNext() para verificar se há algum documento disponível no cursor e, em seguida, use o método next() para recuperar o próximo documento disponível do cursor:

MongoCursor<Document> cursor = collection.find().cursor();
while (cursor.hasNext()){
System.out.println(cursor.next().toJson());
}

Para obter mais informações sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:

Use o método close() em um bloco finally para liberar o consumo de recursos de um cursor no aplicativo cliente e no sistema do MongoDB:

MongoCursor<Document> cursor = collection.find().cursor();
try {
while (cursor.hasNext()){
System.out.println(cursor.next().toJson());
}
} finally {
cursor.close();
}

Use uma instrução try-with-resources para liberar automaticamente o consumo de recursos de um cursor no aplicativo cliente e no sistema do MongoDB:

try(MongoCursor<Document> cursor = collection.find().cursor()) {
while (cursor.hasNext()){
System.out.println(cursor.next().toJson());
}
}

Para obter mais informações sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:

Voltar

Retrieve Data