Menu Docs
Página inicial do Docs
/ / /
Driver GO
/ / /

Acessar dados de um cursor

Nesta página

  • Visão geral
  • Amostra de cursor
  • Recuperar documentos individualmente
  • Cursor atualizado
  • Recuperar todos os documentos
  • Fechar o cursor
  • Informações adicionais
  • Documentação da API

Neste guia, você pode aprender como acessar dados com um cursor.

Um cursor é um mecanismo que permite que uma aplicação itere sobre os resultados do banco de dados enquanto mantém apenas um subconjunto deles na memória em um determinado momento. Operações de leitura que correspondem a vários documentos usam um cursor para retornar esses documentos em lotes em vez de todos de uma vez.

Cada seção usa a seguinte variável cursor, que é um Cursor estruturado contendo todos os documentos em uma coleção:

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

Nos exemplos deste guia, o driver desvincula os documentos mantidos na variável cursor a uma amostra de estrutura MyStruct.

Importante

Um cursor não é goroutine seguro. Não use o mesmo cursor em várias goroutines ao mesmo tempo.

Para recuperar documentos do cursor individualmente enquanto bloqueia a goroutine atual, use o método Next().

O método retorna um documento se todas as seguintes condições forem atendidas:

  • Um documento está atualmente ou estará disponível posteriormente.

  • O motorista não lançou nenhum erro.

  • O contexto não expirou.

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 tentar recuperar um documento de um cursor persistente, use o método TryNext().

O método retorna um documento se todas as seguintes condições forem atendidas:

  • Um documento está atualmente disponível.

  • O motorista não lançou nenhum erro.

  • O contexto não expirou.

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 preencher uma array com todos os seus resultados de query, utilize o 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

Memória

Se o número e o tamanho dos documentos retornados pela sua query excederem a memória disponível do aplicativo, seu programa falhará. Se você não tiver um definir grande, deverá consumir o cursor iterativamente.

Quando seu aplicativo não exigir mais um cursor, feche o cursor com o método Close(). Esse método libera os recursos que o cursor consome no aplicativo cliente e no servidor MongoDB.

defer cursor.Close(context.TODO())

Observação

Feche o cursor ao recuperar documentos individualmente, pois esses métodos tornam o cursor ajustável.

Para saber mais sobre as operações abordadas neste guia, consulte os seguintes guias:

  • Recuperar dados

  • Especificar uma query

  • Trabalhe com BSON

  • Cursores persistentes

Para saber mais sobre cursores e como acessar seus elementos, consulte a seguinte documentação da API:

← Recuperar dados