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 flujo

En esta guía, puedes aprender cómo acceder a datos utilizando un Flow con el controlador de MongoDB Kotlin.

Un Flow es un tipo de dato integrado en las corrutinas de Kotlin que representa una secuencia de valores que se están calculando de forma asincrónica. El driver de corrutinas de Kotlin utiliza flujos para representar los resultados de las operaciones de lectura de bases de datos.

Esta página usa un método inicial, find(), para mostrar cómo acceder a datos desde una FindFlow.

Nota

Las siguientes formas de acceder a los datos y almacenarlos se aplican a otros iterables, como un AggregateFlow.

El método find() crea y devuelve una instancia de un FindFlow. Un FindFlow te permite explorar los documentos que coinciden con tus criterios de búsqueda y especificar aún más qué documentos ver configurando parámetros mediante métodos.

Tip

Tiempo de espera de Flujo

Puedes establecer un tiempo de espera en tu flujo para obtener los resultados de la query. Para obtener más información, consulte el Sección Cursores de la guía Limitar el tiempo de ejecución del servidor.

Los métodos terminal ejecutan una operación en el servidor de MongoDB después de configurar todos los parámetros de una instancia de Flow que controla la operación.

Usa el método firstOrNull() para recuperar el primer documento en los resultados de tu query o null si no hay resultados:

val resultsFlow = collection.find()
val firstResultOrNull = resultsFlow.firstOrNull()

Como alternativa, puedes utilizar el método first() para recuperar el primer documento en tu query o lanzar un NoSuchElementException si no hay resultados:

try {
val resultsFlow = collection.find()
val firstResult = resultsFlow.first()
} catch (e: NoSuchElementException) {
println("No results found")
}

Estos métodos suelen utilizarse cuando el filtro de consulta coincide con un documento, por ejemplo, al filtrar por un índice único.

Utiliza el método count() para recuperar el número de resultados en la query:

val resultsFlow = collection.find()
val count = resultsFlow.count()

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

val resultsFlow = collection.find()
val results = resultsFlow.toList()

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.

Usa el método collect() para iterar a través de los documentos recuperados y asegura que el flujo se cierre si hay una terminación anticipada:

val resultsFlow = collection.find()
resultsFlow.collect { println(it) }

Utiliza el método explain() para ver información sobre cómo MongoDB ejecuta tu 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

ALL_PLANS_EXECUTIONS

Quieres saber qué plan elegirá MongoDB para ejecutar tu query.

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:

val explanation = collection.find().explain(ExplainVerbosity.EXECUTION_STATS)
val jsonSummary = explanation.getEmbedded(
listOf("queryPlanner", "winningPlan"),
Document::class.java
).toJson()
println(jsonSummary)
{ "stage": "COLLSCAN", "direction": "forward" }

Para obtener más información sobre la operación explicar, consulta las siguientes entradas del Manual del servidor:

Al hacer una consulta en una colección con tamaño fijo, puedes usar un cursor con seguimiento que permanezca 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, indica CursorType.TailableAwait en la opción cursorType de un método find().

El siguiente ejemplo utiliza un cursor con seguimiento para rastrear una colección con tamaño fijo e imprimir los documentos. Como el Flow está respaldado por un cursor con seguimiento que permanece abierto, el cursor con seguimiento agrega nuevos resultados al Flow cuando se añaden documentos a la colección.

val results = collection.find<Document>().cursorType(CursorType.TailableAwait)
results.collect { document ->
println("Document: $document")
}

Para obtener más información sobre los cursores con seguimiento, consulta la guía de Cursores con seguimiento en el manual del servidor de MongoDB.

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

Cuenta los valores distintos de campo

En esta página