Docs Menu
Docs Home
/ /

Acceder a los datos desde un cursor

En esta guía, puede aprender cómo acceder a los datos de un cursor con el controlador C.

Un cursor es un mecanismo que devuelve los resultados de una operación de lectura en lotes iterables. Dado que un cursor solo contiene un subconjunto de documentos en un momento dado, reduce tanto el consumo de memoria como el número de solicitudes que el controlador envía al servidor.

Siempre que el controlador C realiza una operación de lectura que devuelve varios documentos, automáticamente devuelve esos documentos en un cursor.

Los ejemplos de esta guía utilizan el restaurants colección en la base de datos sample_restaurants de la Conjuntos de datos de ejemplo de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de ejemplo, consulte la guía de introducción a MongoDB.

Para iterar sobre el contenido de un cursor, utilice un bucle while. El siguiente ejemplo recupera todos los documentos de la colección restaurants e imprime cada documento iterando sobre el 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" }
...

Recupera documentos de un cursor individualmente llamando a la función mongoc_cursor_next(). Esta función itera sobre el cursor y asigna el parámetro bson al siguiente documento en el cursor.

El siguiente ejemplo busca todos los documentos de una colección con un valor name de "Dunkin' Donuts". A continuación, imprime el primer documento en el cursor mediante la función 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 cerrar un cursor y liberar todos los recursos asociados, llame a la función mongoc_cursor_destroy() como se muestra en el siguiente ejemplo:

mongoc_cursor_destroy(cursor);

Al hacer una consulta en una colección con tamaño fijo, puedes usar un cursor con seguimiento que permanezca abierto después de que el cliente agote los resultados en un cursor. Para crear un cursor con seguimiento en una colección con tamaño fijo, especifica las opciones tailable y awaitData al realizar una operación de búsqueda.

El siguiente ejemplo crea un cursor adaptable en una colección 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 obtener más información sobre los cursores adaptables y su uso, consulte la guía Cursores adaptables en el manual del servidor MongoDB.

Los cursores en MongoDB pueden agotar el tiempo de espera en el servidor si han estado abiertos durante mucho tiempo sin que se les haya realizado ninguna operación. Esto puede generar una excepción CursorNotFound al intentar iterar sobre el cursor. Para solucionar este problema, abra un nuevo cursor.

Para aprender más sobre alguna de las funciones tratadas en esta guía, consulta la siguiente documentación de la API:

Volver

Valores únicos de campo

En esta página