Docs 菜单
Docs 主页
/ / /
C++ 驱动程序
/

从游标访问数据

在此页面上

  • Overview
  • 检索所有游标文档
  • 分别检索文档
  • 可追加游标
  • 更多信息

在本指南中,您可以学习;了解如何使用C++驾驶员从游标访问权限数据。

游标是一种以可迭代批处理方式返回读取操作结果的机制。 游标在任何给定时间仅保存文档的子集而不是立即返回所有文档,从而减少内存消耗和网络带宽使用。

每当C++驾驶员使用 find()方法执行读取操作时,它都会在mongocxx::cursor实例中返回匹配的文档。

本指南中的示例使用 Atlas示例数据集sample_restaurants数据库中的restaurants集合。 要从C++应用程序访问权限此集合,请实例化一个连接到Atlas 集群的mongocxx::client ,并将以下值分配给dbcollection变量:

auto db = client["sample_restaurants"];
auto collection = db["restaurants"];

要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅Atlas入门指南。

要迭代mongocxx::cursor实例的内容,请使用for循环。

以下示例使用find()方法检索name值为"Dunkin' Donuts"的所有文档。 然后,它会打印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" }
...

要从游标检索单个文档,请在mongocxx::cursor实例上调用begin()方法。 此方法返回一个mongocxx::cursor::iterator实例,它指向游标中的第一个文档。

以下示例查找集合中name值为"Dunkin' Donuts"的所有文档。 然后,它通过调用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" }

对固定大小固定大小集合进行查询时,可以使用可可追加游标,该游标在客户端用完游标中的结果后仍保持打开状态。 要创建可可追加游标,请实例化一个mongocxx::options::find对象设立其cursor_type字段设置为mongocxx::cursor::type::k_tailable 。 然后,将mongocxx::options::find实例作为参数传递给find()方法。

示例,您可以创建一个名为vegetables的固定大小固定大小集合来存储表示蔬菜的文档,如以下代码所示:

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);

以下代码使用可可追加游标来检索vegetables集合中的所有文档。 游标耗尽后,它将保持打开状态,直到检索到三个文档:

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" }

如果将另一个文档插入到vegetables集合中,前面的代码将打印新文档并关闭while循环。

要了解有关可追加游标的更多信息,请参阅 MongoDB Server 手册中的可追加游标指南

要学习;了解有关读取操作的更多信息,请参阅检索数据指南。

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档:

后退

计算文档