Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Acceder a datos desde un cursor

En esta guía, puedes aprender cómo acceder a datos de un cursor utilizando el controlador de C++.

Un cursor es un mecanismo que devuelve los resultados de una operación de lectura en lotes iterables. Los cursores reducen tanto el consumo de memoria como el uso del ancho de banda de la red al mantener solo un subconjunto de documentos en cualquier momento, en lugar de devolver todos los documentos de una vez.

Cada vez que el controlador de C++ realiza una operación de lectura utilizando el método find(), devuelve los documentos coincidentes en una instancia de mongocxx::cursor.

Los ejemplos de esta guía utilizan la colección restaurants en la base de datos sample_restaurants de los conjuntos de datos de muestra de Atlas. Para acceder a esta colección desde su aplicación C++, cree una instancia de mongocxx::client que se conecte a un clúster de Atlas y asigne los siguientes valores a sus variables db y collection:

auto db = client["sample_restaurants"];
auto collection = db["restaurants"];

Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta la guía de Introducción a MongoDB.

Para iterar sobre el contenido de una instancia mongocxx::cursor, utiliza un bucle for.

El siguiente ejemplo usa el método find() para recuperar todos los documentos que tienen un valor name de "Dunkin' Donuts". Luego imprime cada documento del cursor devuelto por el método find():

auto cursor = collection.find(make_document(kvp("name", "Dunkin' Donuts")));
for(auto&& doc : cursor) {
std::cout << bsoncxx::to_json(doc) << std::endl;
}
{ "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40379573" }
{ "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40363098" }
{ "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40395071" }
...

Para recuperar un documento individual de un cursor, llama al método begin() en una instancia mongocxx::cursor. Este método retorna una instancia de mongocxx::cursor::iterator que apunta al primer documento del cursor.

El siguiente ejemplo encuentra todos los documentos en una colección que tienen un valor de name de "Dunkin' Donuts". Luego imprime el primer documento del cursor llamando al método begin():

auto cursor = collection.find(make_document(kvp("name", "Dunkin' Donuts")));
auto doc = cursor.begin();
std::cout << bsoncxx::to_json(*doc) << std::endl;
{ "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40379573" }

Al consultar una colección con tamaño fijo, puede utilizar un cursor con seguimiento que permanece abierto después de que el cliente agota los resultados en un cursor. Para crear un cursor con seguimiento, instancie un objeto mongocxx::options::find y establezca su campo cursor_type en mongocxx::cursor::type::k_tailable. Luego, pase su instancia de mongocxx::options::find como argumento al método find().

Por ejemplo, puedes crear una colección con tamaño fijo llamada vegetables que almacene documentos que representen vegetales, como se muestra en el siguiente código:

auto db = client["db"];
auto collection = db.create_collection("vegetables", make_document(kvp("capped", true), kvp("size", 1024 * 1024)));
std::vector<bsoncxx::document::value> vegetables;
vegetables.push_back(make_document(kvp("name", "cauliflower")));
vegetables.push_back(make_document(kvp("name", "zucchini")));
auto result = collection.insert_many(vegetables);

El siguiente código utiliza un cursor con seguimiento para recuperar todos los documentos de la colección vegetables. Después de que el cursor se agota, permanece abierto hasta recuperar tres documentos:

mongocxx::options::find opts{};
opts.cursor_type(mongocxx::cursor::type::k_tailable);
auto cursor = collection.find({}, opts);
int docs_found = 0;
while (docs_found < 3) {
for (auto&& doc : cursor) {
std::cout << bsoncxx::to_json(doc) << std::endl;
docs_found++;
}
// Sleeps for 100 milliseconds before trying to access more documents
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
{ "_id" : { "$oid" : "..." }, "name" : "cauliflower" }
{ "_id" : { "$oid" : "..." }, "name" : "zucchini" }

Si insertas otro documento en la colección vegetables, el código anterior imprime el nuevo documento y cierra el bucle while.

Para aprender más sobre cursores con seguimiento, consulta la Guía de cursores con seguimiento en el manual del servidor MongoDB.

Para aprender más sobre las operaciones de lectura, consulta la guía Recuperar datos.

Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: