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 é uma estrutura Cursor que contém 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 é 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 caudal, 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
If the number and size of documents returned by your query exceeds available application memory, your program will crash. If you except a large result set, you should consume your cursor iteratively.
Fechar o cursor
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
Close the cursor when you retrieve documents individually because those methods make a cursor tailable.
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: