Overview
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.
Cursor de muestra
Cada sección utiliza lo siguiente cursor variable, que es una estructura Cursor que contiene todos los documentos de 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 Goroutines seguros. No utilice el mismo cursor en varias goroutines simultáneamente.
Recuperar documentos individualmente
Para recuperar documentos de tu cursor de manera individual mientras bloqueas la goroutine actual, utiliza el método Next().
El método devuelve 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) }
Cursor con seguimiento
Para intentar recuperar un documento de un cursor con seguimiento, utiliza el método TryNext().
El método devuelve 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 } }
Recuperar todos los documentos
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 devueltos por su consulta exceden la memoria disponible de la aplicación, el programa se bloqueará. Si espera un conjunto de resultados grande, debe usar el cursor iterativamente.
Cierra el cursor
Cuando su aplicación ya no requiera un cursor, ciérrelo con el método Close(). Este método libera los recursos que consume el cursor, tanto en la aplicación cliente como en el servidor MongoDB.
defer cursor.Close(context.TODO())
Nota
Cierra el cursor cuando recuperes documentos individualmente porque esos métodos hacen que un cursor sea tailable.
Información Adicional
Para obtener más información sobre las operaciones analizadas en esta guía, consulte las siguientes guías:
Documentación de la API
Para aprender más sobre cursores y cómo acceder a sus elementos, consulta la siguiente Documentación de la API: