Overview
En esta guía, puede aprender cómo acceder a los datos de un cursor utilizando el controlador 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.
Siempre que el controlador de C++ realice una operación de lectura usando el find()
método, devuelve los documentos coincidentes en una instancia mongocxx::cursor.
Datos de muestra
Los ejemplos de esta guía usan la colección restaurants en la base de datos sample_restaurants de la conjuntos de datos de muestra de Atlas. Para acceder a esta colección desde su aplicación C++, instancie un 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 cómo crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de ejemplo, consulta la guía MongoDB Get Started.
Recuperar todos los documentos de cursor
Para iterar sobre el contenido de una instancia mongocxx::cursor, utiliza un bucle for.
El siguiente ejemplo utiliza el método find() para recuperar todos los documentos cuyo valor name es "Dunkin' Donuts". A continuación, imprime cada documento desde el 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 busca todos los documentos de una colección cuyo valor name es "Dunkin' Donuts". A continuación, imprime el primer documento desde el 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 en una colección con tamaño fijo, puedes usar un cursor con seguimiento que permanece abierto después de que el cliente agota los resultados en un cursor. Para crear un cursor tailable, instanciá un objeto mongocxx::options::find y establecé su campo cursor_type en mongocxx::cursor::type::k_tailable. Luego, pasa tu instancia 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 adaptable para recuperar todos los documentos de la colección vegetables. Una vez agotado el cursor, 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 obtener más información sobre las operaciones de lectura, consulte el Guía sobre cómo encontrar documentos.
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: