Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Acceder a datos desde un cursor

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.

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

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

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)

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

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.

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.

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