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 usam a coleção restaurants no banco de dados sample_restaurants dos conjuntos de dados de amostra do Atlas. Para aprender a criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o Guia de Introdução do MongoDB.
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);
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 uma collection com um name valor de "Dunkin' Donuts". 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);
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
When querying on a capped collection, you can use a tailable cursor that remains open after the client exhausts the results in a cursor. To create a tailable cursor on a capped collection, specify the tailable and awaitData options when performing a find operation.
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: