Overview
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.
Datos de muestra
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.
Recuperar todos los documentos de cursor
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" } ...
Recuperar documentos individualmente
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" }
Cursores con seguimiento
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.
Información Adicional
Para aprender más sobre las operaciones de lectura, consulta la guÃa Recuperar datos.
Documentación de la API
Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guÃa, consulta la siguiente documentación de API: