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

Acessar dados de um cursor

Nesta página

  • Visão geral
  • Acesse o conteúdo do cursor iterativamente
  • Recuperar documentos individualmente
  • Fechar um cursor
  • Cursores persistentes
  • Solução de problemas
  • Documentação da API

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.

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 .

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" }
...

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" }

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);

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 .

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.

Para saber mais sobre qualquer uma das funções discutidas nesta guia, consulte a seguinte documentação da API:

Voltar

Valores de campo distintos