Docs Menu
Docs Home
/ /

Acceder a los datos desde un cursor

En esta guía, puede aprender cómo acceder a los datos mediante un cursor en el controlador Java.

Un cursor es un mecanismo que permite a una aplicación iterar sobre los resultados de una base de datos, manteniendo solo un subconjunto de ellos en memoria en un momento dado. El controlador utiliza cursores en operaciones de lectura que coinciden con varios documentos para devolver los documentos coincidentes en lotes, en lugar de devolverlos todos a la vez.

Esta página utiliza un método de iniciación, find() para mostrar cómo acceder a los datos de un EncontrarIterable.

Nota

Las siguientes formas de acceder y almacenar datos se aplican a otros iterables como AggregateIterable.

El método find() crea y devuelve una instancia de FindIterable. Un FindIterable permite explorar los documentos que coinciden con los criterios de búsqueda y especificar qué documentos ver mediante la configuración de parámetros mediante métodos.

Tip

Tiempo de espera del cursor

Puede establecer un tiempo de espera en el cursor para devolver los resultados de la consulta. Para obtener más información, consulte SecciónCursores de la guía Limitar el tiempo de ejecución del servidor.

Los métodos terminales ejecutan una operación en la implementación de MongoDB después de configurar todos los parámetros de una instancia de Iterable que controla la operación.

Utilice el método first() para recuperar el primer documento en los resultados de su consulta:

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

Este método se utiliza a menudo cuando el filtro de consulta coincidirá con un documento, como cuando se filtra por un índice único.

Utilice el método available() para recuperar la cantidad de resultados presentes localmente sin bloqueo:

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

El método devuelve 0 si la aplicación ya ha iterado a través de todos los documentos en el cursor o si el cursor está cerrado.

Utilice el método into() para almacenar los resultados de su consulta en un List:

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

Este método se utiliza a menudo cuando el filtro de consulta devuelve una pequeña cantidad de documentos que pueden caber en la memoria disponible.

Utilice el método cursor() para iterar a través de los documentos obtenidos y asegurarse de que el cursor se cierre si hay una finalización anticipada:

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

Para obtener más información sobre cómo garantizar que un cursor se cierre, consulte la sección de limpieza del cursor.

Utilice el método explain() para ver información sobre cómo MongoDB ejecuta su operación.

El explain() método devuelve planes de ejecución y estadísticas de rendimiento. Un plan de ejecución es una forma posible de que MongoDB complete una operación. El explain() método proporciona tanto el plan ganador (el plan ejecutado por MongoDB) como los planes rechazados.

Puede especificar el nivel de detalle de su explicación pasando un nivel de verbosidad al método explain().

La siguiente tabla muestra todos los niveles de verbosidad para las explicaciones y sus casos de uso previstos:

Nivel de verbosidad
Caso de uso

TODAS LAS EJECUCIONES DE LOS PLANES

Desea saber qué plan elegirá MongoDB para ejecutar su consulta.

ESTADÍSTICAS DE EJECUCIÓN

Quiere saber si su consulta está funcionando bien.

PLANIFICADOR DE CONSULTAS

Tienes un problema con tu query y quieres la mayor cantidad de información posible para diagnosticar el problema.

El siguiente ejemplo imprime la representación JSON del plan ganador para las etapas de agregación que producen planes de ejecución:

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

El fragmento de código anterior produce el siguiente resultado:

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

Para obtener más información sobre la operación de explicación, consulte las siguientes entradas del Manual del servidor:

Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de API:

Un MongoCursor y FindIterable le permiten acceder a los resultados de las query de un documento a la vez, abstrayendo la lógica de red y caché.

Pase una función al método forEach() de un FindIterable para iterar a través de los resultados en un estilo funcional:

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

Importante

Los métodos de inicio devuelven objetos que implementan la interfaz Iterable, lo que permite iterarlos mediante métodos iteradores. En ocasiones, utilizamos un bucle for-each mejorado para iterar los resultados:

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

No es recomendable iterar de esta manera, ya que si se lanza una excepción antes de que se complete el bucle, el cursor no se cerrará. Usar un nos MongoCursor permite asegurar el cierre del cursor, como se muestra en la sección de limpieza del cursor.

Usa el método hasNext() para comprobar si hay documentos disponibles en el cursor y luego utiliza el método next() para recuperar el siguiente documento disponible del cursor:

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

Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de API:

Utilice el método close() en un bloque finally para liberar el consumo de recursos de un cursor tanto en la aplicación cliente como en la implementación de MongoDB:

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

Use una instrucción try-with-resources para liberar automáticamente el consumo de recursos de un cursor tanto en la aplicación cliente como en la implementación de MongoDB:

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

Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de API:

Volver

Texto de query

En esta página