Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Acceder a datos desde un cursor

En esta guía, podrá aprender cómo acceder a los datos mediante el uso de un cursor en el controlador de 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 inicio, find() para mostrar cómo acceder a los datos desde un FindIterable.

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

Puedes configurar un tiempo de espera en tu cursor para devolver los resultados de la consulta. Para aprender más, consulta el Sección Cursores 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 suele utilizarse cuando el filtro de consulta coincidirá con un documento, como cuando se filtra por un índice único.

Utiliza el método available() para recuperar el número de resultados localmente presentes 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.

Usa el método into() para almacenar los resultados de las consultas en un List:

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

Este método se usa a menudo cuando tu filtro de query devuelve un pequeño número de documentos que pueden caber en la memoria disponible.

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

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

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

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

El método explain() devuelve planes de ejecución y estadísticas de rendimiento. Un plan de ejecución es una forma potencial en la que MongoDB puede completar una operación. El método explain() ofrece tanto el plan ganador (el plan ejecutado por MongoDB) como los planes rechazados.

Puedes especificar el nivel de detalle de tu 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.

EXECUTION_STATS

Tu quieres saber si tu query está funcionando bien.

QUERY_PLANNER

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 la siguiente salida:

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

Para 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 la 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 iniciación devuelven objetos que implementan la interfaz Iterable, lo que te permite iterar a través de ellos usando métodos de iterador. A veces, usamos un bucle mejorado for-each para iterar a través de los resultados:

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

Iterar de esta manera no es preferible porque si se produce una excepción antes de que el bucle termine, el cursor no se cerrará. Usar un MongoCursor nos permite garantizar que el cursor se cierre 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 la API:

Utiliza 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 la API:

Volver

Texto de query

En esta página