Docs Menu
Docs Home
/ /

Acceder a los datos desde un cursor

En esta guía, puede 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 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 desagrupa los documentos almacenados 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.

Para recuperar documentos de su cursor individualmente mientras bloquea la goroutine actual, utilice el método Next().

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

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

  • El conductor no arrojó ningún error.

  • El contexto no caducó.

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 rastreable, utilice el TryNext() método.

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

  • Actualmente hay un documento disponible.

  • El conductor no arrojó ningún error.

  • El contexto no caducó.

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 rellenar una matriz con todos los resultados de su consulta, 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.

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 recuperas documentos individualmente porque esos métodos hacen que el cursor sea rastreable.

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

  • Buscar documentos

  • Especifica un query

  • Trabajar con BSON

  • Cursores con seguimiento

Para obtener más información sobre los cursores y cómo acceder a sus elementos, consulte la siguiente documentación de API:

Volver

Buscar documentos

En esta página