Acessar dados de um cursor
Nesta página
Visão geral
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.
Métodos de terminal
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.
Primeiro
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.
Número de resultados
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.
Into
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.
Cursor
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.
explicar
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 detalhamento para o método explain()
.
A tabela a seguir mostra todos os níveis de detalhamento 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:
Padrões de uso
Um MongoCursor
e FindIterable
permitem acessar os resultados da query um documento de cada vez, abstraindo a lógica de rede e de cache.
Iteração funcional
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.
Iteração condicional
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:
Limpeza do cursor
Fechar
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(); }
Tente com a Declaração de Recursos
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: