Overview
En esta guía, puedes aprender a acceder a datos desde un cursor con el driver Kotlin sincronizar.
Un cursor es un mecanismo que devuelve los resultados de una operación de lectura en lotes iterables. Debido a que un cursor solo mantiene un subconjunto de documentos en un momento dado, los cursores reducen tanto el consumo de memoria como el número de solicitudes que el controlador envía al servidor.
Siempre que el controlador de sincronización de Kotlin realiza una operación de lectura que devuelve varios documentos, automáticamente devuelve esos documentos en un cursor.
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.
Datos de muestra
Los ejemplos de esta guía utilizan el restaurants colección en la base de datos sample_restaurants de la conjuntos de datos de muestra de Atlas. Para aprender a crear una implementación gratuita de MongoDB y cargar los conjuntos de datos de ejemplo, consulta la guía de MongoDB Get Started.
La siguiente clase de datos de Kotlin modela los documentos de esta colección:
data class Restaurant( val id: ObjectId, val name: String )
Acceso iterativo al contenido del cursor
Para iterar sobre el contenido de un cursor, debe utilizar el método forEach(), como se muestra en el siguiente ejemplo:
val results = collection.find() results.forEach { result -> println(result) }
Alternativamente, utilice el método use() para implementar un bucle en el cursor:
val results = collection.find() results.cursor().use { cursor -> while (cursor.hasNext()) { println(resultCursor.next()) } }
Nota
Por defecto, MongoDB cierra un cursor cuando el cliente ha agotado todos los resultados en el cursor. Los ejemplos de esta guía cierran explícitamente los cursores mediante el método close().
Recuperar documentos individualmente
Recupera documentos de un cursor individualmente llamando al método next().
El siguiente ejemplo encuentra todos los documentos en una colección con un valor de name de "Dunkin' Donuts". Luego imprime el primer documento en el cursor llamando al método next().
val results = collection .find<Restaurant>(eq(Restaurant::name.name, "Dunkin' Donuts")) results.cursor().use { cursor -> println(if (cursor.hasNext()) cursor.next() else "No document matches the filter") }
Restaurant(id=5eb3d668b31de5d588f42c66, name=Dunkin' Donuts)
Recuperar todos los documentos
Advertencia
Si la cantidad y el tamaño de los documentos devoluidos por tu query superan la memoria disponible de la aplicación, tu programa se bloqueará. Si esperas un conjunto de resultados grande, accede a tu cursor de forma iterativa.
Para recuperar todos los documentos de un cursor, convierte el cursor en un List, como se muestra en el siguiente ejemplo:
val results = collection.find<Restaurant>(eq(Restaurant::name.name, "Dunkin' Donuts")) val resultsList = results.toList() for (result in resultsList) { println(result) }
Restaurant(id=5eb3d668b31de5d588f42c66, name=Dunkin' Donuts) Restaurant(id=5eb3d668b31de5d588f42ca0, name=Dunkin' Donuts) Restaurant(id=5eb3d668b31de5d588f42b08, name=Dunkin' Donuts) Restaurant(id=5eb3d668b31de5d588f42cd7, name=Dunkin' Donuts) ...
Cursores con seguimiento
Al consultar en una colección con tamaño fijo, puedes usar un cursor con seguimiento que permanece abierto después de que el cliente agote los resultados en un cursor. Para crear un cursor con seguimiento con una colección con tamaño fijo, especifica CursorType.TailableAwait en el método cursorType de un objeto FindIterable.
El siguiente ejemplo crea un cursor con seguimiento en una colección con tamaño fijo:
val results = collection.find<Document>().cursorType(CursorType.TailableAwait)
Para obtener más información sobre los cursores con seguimiento y su uso, consulta la Guía de cursores con seguimiento en el manual de MongoDB Server.
Solución de problemas
"CursorNotFound ID de cursor no válido en el servidor"
Los cursores en MongoDB pueden caducar en el servidor si han estado abiertos durante mucho tiempo sin que se haya realizado ninguna operación en ellos. Esto puede llevar a una excepción CursorNotFound cuando se intente iterar a través del cursor.
Documentación de la API
Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: