Acessar dados de um cursor
Nesta página
Visão geral
Neste guia, você pode aprender como acessar dados de um cursor com o driver C.
Um cursor é um mecanismo que retorna os resultados de uma operação de leitura em lotes iteráveis. Como um cursor contém apenas um subconjunto de documentos a qualquer momento, os cursores reduzem o consumo de memória e o número de solicitações que o driver envia ao servidor.
Sempre que o driver C executa uma operação de leitura que retorna vários documentos, ele retorna automaticamente esses documentos em um cursor.
Dados de amostra
Os exemplos neste guia utilizam a coleção do restaurants
no banco de dados de dados do sample_restaurants
a partir dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o guia Iniciar com Atlas .
Acesse o conteúdo do cursor iterativamente
Para iterar sobre o conteúdo de um cursor, use um loop enquanto. O exemplo a seguir recupera todos os documentos na coleção restaurants
e imprime cada documento iterando sobre o cursor:
const bson_t *doc; bson_t *filter = bson_new (); mongoc_cursor_t *results = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); while (mongoc_cursor_next (results, &doc)) { char *str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); } mongoc_cursor_destroy (results); bson_destroy (filter);
{ "_id" : { "$oid" : "..." }, ... , "name" : "Golden Pavillion", "restaurant_id" : "40363920" } { "_id" : { "$oid" : "..." }, ... , "name" : "Morris Park Bake Shop", "restaurant_id" : "30075445" } { "_id" : { "$oid" : "..." }, ... , "name" : "Criminal Court Bldg Cafeteria", "restaurant_id" : "40364443" } { "_id" : { "$oid" : "..." }, ... , "name" : "7B Bar", "restaurant_id" : "40364518" } { "_id" : { "$oid" : "..." }, ... , "name" : "Nyac Main Dining Room", "restaurant_id" : "40364467" } ...
Recuperar documentos individualmente
Recupere documentos de um cursor individualmente chamando a função mongoc_cursor_next()
. Esta função itera sobre o cursor e define o parâmetro bson
para o próximo documento no cursor.
O exemplo a seguir encontra todos os documentos em "Dunkin' Donuts"
name
com um valor de . Em seguida, ele imprime o primeiro documento no cursor chamando a função mongoc_cursor_next()
.
const bson_t *doc; bson_t *filter = BCON_NEW ("name", BCON_UTF8 ("Dunkin' Donuts")); mongoc_cursor_t *results = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); mongoc_cursor_next (results, &doc); char *str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); mongoc_cursor_destroy (results); bson_destroy (filter);
{ "_id" : { "$oid" : "..." }, ... , "name" : "Dunkin' Donuts", "restaurant_id" : "40392410" }
Fechar um cursor
Para fechar um cursor e liberar todos os recursos associados, chame a função mongoc_cursor_destroy()
como mostrado no seguinte exemplo:
mongoc_cursor_destroy (cursor);
Cursores persistentes
Ao fazer query em uma collection limitada, você pode usar um cursor persistente que permanece aberto depois que o cliente esgota os resultados em um cursor. Para criar um cursor persistente em uma collection limitada, especifique as opções tailable
e awaitData
ao executar uma operação de busca.
O exemplo a seguir cria um cursor persistente em uma collection limitada:
collection = mongoc_client_get_collection (client, "<database>", "<capped collection>"); bson_t *filter = bson_new (); bson_t *opts = BCON_NEW ("tailable", BCON_BOOL (true), "awaitData", BCON_BOOL (true)); mongoc_cursor_t *tailable_cursor = mongoc_collection_find_with_opts(collection, filter, opts, NULL); // Perform operations with tailable cursor here mongoc_cursor_destroy (tailable_cursor); bson_destroy (filter); bson_destroy (opts);
Para saber mais sobre cursores tailable e seu uso, consulte o guia Cursores tailable no manual do MongoDB Server .
Solução de problemas
"CursorNotFound ID de cursor inválido no servidor"
Os cursores no MongoDB podem atingir o tempo limite no servidor se estiverem abertos há muito tempo sem que nenhuma operação seja executada neles. Isso pode levar a uma exceção CursorNotFound
quando você tenta iterar pelo cursor. Para resolver esse problema, abra um novo cursor.
Documentação da API
Para saber mais sobre qualquer uma das funções discutidas nesta guia, consulte a seguinte documentação da API: