Acessar dados de um cursor
Nesta página
Visão geral
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.
Amostra de cursor
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.
Recuperar documentos individualmente
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 driver 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) }
Cursor atualizado
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 driver 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 } }
Recuperar todos os documentos
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.
Fechar o cursor
Quando seu aplicação não precisar mais usar um cursor, feche o cursor com o método Close()
. Esse método libera os recursos que o cursor consome no aplicação 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.
Informações adicionais
Para saber mais sobre as operações abordadas neste guia, consulte os seguintes guias:
Documentação da API
Para saber mais sobre cursores e como acessar seus elementos, consulte a seguinte documentação da API: