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 C++ realiza una operación de lectura mediante el uso de find()
método, devuelve los documentos coincidentes en una instancia mongocxx::cursor.
Datos de muestra
Los ejemplos de esta guía utilizan 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++, cree una mongocxx::client instancia de que se conecte a un clúster de Atlas y asigne los siguientes valores a las variables db collection y:
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 muestra, consulte la guía de introducción a MongoDB.
Recuperar todos los documentos del 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 una colección limitada, puede usar un cursor adaptable que permanece abierto después de que el cliente agote los resultados de un cursor. Para crear un cursor adaptable, cree una instancia de un mongocxx::options::find objeto y asigne el cursor_type valor a su mongocxx::cursor::type::k_tailable campo. A continuación, pase la mongocxx::options::find instancia como argumento al find() método.
Por ejemplo, puede crear una colección limitada llamada vegetables que almacene documentos que representen verduras, 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 inserta otro documento en la colección vegetables, el código anterior imprime el nuevo documento y cierra el bucle while.
Para obtener más información sobre los cursores adaptables, consulte la guía Cursores adaptables en el manual del servidor MongoDB.
Información Adicional
Para obtener más información sobre las operaciones de lectura, consulte la Guía de búsqueda de 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: