Docs Menu
Docs Home
/ /

Acceder a los datos desde un cursor

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.

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(
@BsonId
val id: ObjectId,
val name: String
)

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().

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)

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)
...

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.

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.

Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API:

Volver

Valores únicos de campo

En esta página