Acessar dados de um cursor
Nesta página
Visão geral
Neste guia, você pode aprender como acessar dados de um cursor usando o driver C++ .
Um cursor é um mecanismo que retorna os resultados de uma operação de leitura em lotes iteráveis. Os cursores reduzem o consumo de memória e o uso da largura de banda da rede, mantendo apenas um subconjunto de documentos a qualquer momento, em vez de retornar todos os documentos de uma só vez.
Sempre que o driver C++ executa uma operação de leitura usando o método find()
, ele retorna os documentos correspondentes em uma instância mongocxx::cursor
.
Dados de amostra
Os exemplos neste guia utilizam a coleção do restaurants
no banco de dados de dados do sample_restaurants
a partir dos conjuntos de dados de amostra do Atlas. Para acessar essa coleção a partir do seu aplicação C++ , instancie um mongocxx::client
que se conecte a um Atlas cluster e atribua os seguintes valores às suas variáveis db
e collection
:
auto db = client["sample_restaurants"]; auto collection = db["restaurants"];
Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o guia Iniciar com Atlas .
Recuperar todos os documentos do cursor
Para iterar sobre o conteúdo de uma instância do mongocxx::cursor
, utilize um loop do for
.
O exemplo seguinte utiliza o método find()
para recuperar todos os documentos que têm um valor name
de "Dunkin' Donuts"
. Em seguida, ele imprime cada documento do cursor retornado pelo 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 um documento individual de um cursor, chame o método begin()
em uma instância mongocxx::cursor
. Este método retorna uma instância de mongocxx::cursor::iterator
que aponta para o primeiro documento no cursor.
O exemplo a seguir encontra todos os documentos em uma name
que têm um "Dunkin' Donuts"
de . Em seguida, ele imprime o primeiro documento do cursor chamando o 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 persistentes
Ao fazer query em uma collection limitada, você pode usar um cursor persistente que permanece aberto depois que o cliente esgota os resultados em um cursor. Para criar um cursor persistente, instancie um objeto mongocxx::options::find
e defina seu campo cursor_type
como mongocxx::cursor::type::k_tailable
. Em seguida, passe sua instância mongocxx::options::find
como argumento para o método find()
.
Por exemplo, você pode criar uma collection limitada chamada vegetables
que armazena documentos que representam Legumes, conforme mostrado no código a seguir:
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);
O código a seguir usa um cursor persistente para recuperar todos os documentos na coleção vegetables
. Depois que o cursor estiver esgotado, ele permanecerá aberto até a recuperação de três 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" }
Se você inserir outro documento na coleção vegetables
, o código anterior imprimirá o novo documento e fechará o loop while
.
Para saber mais sobre cursores tailable, consulte o guia Cursores tailable no manual do MongoDB Server .
Informações adicionais
Para saber mais sobre operações de leitura, consulte o guia Recuperar dados .
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: