Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Acceder a datos desde un cursor

En esta guía, puedes aprender cómo acceder a los datos con un cursor.

Un cursor es un mecanismo que permite a una aplicación iterar sobre los resultados de una base de datos mientras mantiene solo una parte de ellos en la memoria en un momento determinado. Las operaciones de lectura que coinciden con varios documentos usan un cursor para devolver esos documentos en lotes, en lugar de todos a la vez.

Cada sección utiliza la siguiente variable cursor, que es una estructura Cursor que contiene todos los documentos en una colección:

cursor, err := coll.Find(context.TODO(), bson.D{})
if err != nil {
panic(err)
}

En los ejemplos de esta guía, el controlador deserializa los documentos que se encuentran en la variable cursor en una estructura de muestra MyStruct.

Importante

Un cursor no es goroutine seguro. No utilices el mismo cursor en diferentes goroutines al mismo tiempo.

Para recuperar documentos de tu cursor de manera individual mientras bloqueas la goroutine actual, utiliza el método Next().

El método retorna un documento si se cumplen todas las siguientes condiciones:

  • Un documento está disponible ahora o lo estará más adelante.

  • El controlador no produjo errores.

  • El contexto no ha expirado.

for cursor.Next(context.TODO()) {
var result MyStruct
if err := cursor.Decode(&result); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)
}
if err := cursor.Err(); err != nil {
log.Fatal(err)
}

Para intentar recuperar un documento de un cursor con seguimiento, utiliza el método TryNext().

El método retorna un documento si se cumplen todas las siguientes condiciones:

  • Actualmente, hay un documento disponible.

  • El controlador no produjo errores.

  • El contexto no ha expirado.

for {
if cursor.TryNext(context.TODO()) {
var result MyStruct
if err := cursor.Decode(&result); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)
continue
}
if err := cursor.Err(); err != nil {
log.Fatal(err)
}
if cursor.ID() == 0 {
break
}
}

Para completar un arreglo con todos sus resultados de query, utilice el método All():

var results []MyStruct
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Printf("%+v\n", result)
}

Importante

Memoria

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 exceptúas un gran conjunto de resultados, deberías utilizar el cursor de manera iterativa.

Cuando su aplicación ya no requiera un cursor, cierre el cursor con el método Close(). Este método libera los recursos que consume tu cursor tanto en la aplicación cliente como en el servidor de MongoDB.

defer cursor.Close(context.TODO())

Nota

Cierra el cursor cuando recuperes documentos individualmente porque esos métodos hacen que un cursor sea tailable.

Para obtener más información sobre las operaciones mencionadas en esta guía, consulta las siguientes guías:

Para aprender más sobre cursores y cómo acceder a sus elementos, consulta la siguiente Documentación de la API: