Overview
En esta guía, puede aprender cómo acceder a los datos de un cursor con el controlador Kotlin Sync.
Un cursor es un mecanismo que devuelve los resultados de una operación de lectura en lotes iterables. Dado que un cursor solo contiene un subconjunto de documentos en un momento dado, reduce tanto el consumo de memoria como el número de solicitudes que el controlador envía al servidor.
Siempre que el controlador Kotlin Sync realiza una operación de lectura que devuelve varios documentos, automáticamente devuelve esos documentos en un cursor.
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.
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 muestra, consulte la guía de introducción a MongoDB.
La siguiente clase de datos de Kotlin modela los documentos de esta colección:
data class Restaurant( val id: ObjectId, val name: String )
Acceder al contenido del cursor de forma iterativa
Para iterar sobre el contenido de un cursor, utilice 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
De forma predeterminada, MongoDB cierra un cursor cuando el cliente ha agotado todos los resultados. Los ejemplos de esta guía cierran los cursores explícitamente mediante el método close().
Recuperar documentos individualmente
Recupere documentos de un cursor individualmente llamando al método next().
El siguiente ejemplo busca todos los documentos de una colección con un valor name de "Dunkin' Donuts". A continuación, 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 devueltos por su consulta exceden la memoria disponible de la aplicación, el programa se bloqueará. Si espera un conjunto de resultados grande, acceda al cursor iterativamente.
Para recuperar todos los documentos de un cursor, convierta 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 una colección limitada, puede usar un cursor adaptable que permanece abierto después de que el cliente agote los resultados de un cursor. Para crear un cursor adaptable con una colección limitada, especifique CursorType.TailableAwait en el cursorType método de un FindIterable objeto.
El siguiente ejemplo crea un cursor adaptable en una colección limitada:
val results = collection.find<Document>().cursorType(CursorType.TailableAwait)
Para obtener más información sobre los cursores adaptables y su uso, consulte la guía Cursores adaptables en el manual del servidor MongoDB.
Solución de problemas
"CursorNotFound:el ID del cursor no es válido en el servidor"
Los cursores en MongoDB pueden agotar el tiempo de espera en el servidor si han estado abiertos durante mucho tiempo sin que se les haya realizado ninguna operación. Esto puede generar una excepción CursorNotFound al intentar iterar sobre el 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: