Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

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.

Siempre que el controlador de C++ realice una operación de lectura usando el find() método, devuelve los documentos correspondientes en una instancia de mongocxx::cursor.

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.

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 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 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 obtener más información sobre las operaciones de lectura, consulte el Retrieve Data guide.

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

Volver

Contabilizar documentos

En esta página