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

从游标访问数据

在此页面上

  • Overview
  • 以迭代方式访问游标内容
  • 分别检索文档
  • 关闭游标
  • 可追加游标
  • 故障排除
  • API 文档

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

游标是一种以可迭代批处理方式返回读取操作结果的机制。 由于游标在任何给定时间仅保存文档的子集,因此游标可减少内存消耗和驾驶员发送到服务器的请求数量。

每当C驾驶员执行返回多个文档的读操作时,它都会自动在游标中返回这些文档。

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

要遍历游标的内容,请使用 while 循环。以下示例检索 restaurants集合中的所有文档,并通过迭代游标来打印每个文档:

const bson_t *doc;
bson_t *filter = bson_new ();
mongoc_cursor_t *results =
mongoc_collection_find_with_opts (collection, filter, NULL, NULL);
while (mongoc_cursor_next (results, &doc)) {
char *str = bson_as_canonical_extended_json (doc, NULL);
printf ("%s\n", str);
bson_free (str);
}
mongoc_cursor_destroy (results);
bson_destroy (filter);
{ "_id" : { "$oid" : "..." }, ... , "name" : "Golden Pavillion", "restaurant_id" : "40363920" }
{ "_id" : { "$oid" : "..." }, ... , "name" : "Morris Park Bake Shop", "restaurant_id" : "30075445" }
{ "_id" : { "$oid" : "..." }, ... , "name" : "Criminal Court Bldg Cafeteria", "restaurant_id" : "40364443" }
{ "_id" : { "$oid" : "..." }, ... , "name" : "7B Bar", "restaurant_id" : "40364518" }
{ "_id" : { "$oid" : "..." }, ... , "name" : "Nyac Main Dining Room", "restaurant_id" : "40364467" }
...

通过调用 mongoc_cursor_next() 函数从游标单独检索文档。该函数遍历游标,并将 bson 参数设置为游标中的下一个文档。

以下示例查找集合中 name 值为 "Dunkin' Donuts" 的所有文档。然后,它通过调用 mongoc_cursor_next() 函数来打印游标中的第一个文档。

const bson_t *doc;
bson_t *filter = BCON_NEW ("name", BCON_UTF8 ("Dunkin' Donuts"));
mongoc_cursor_t *results =
mongoc_collection_find_with_opts (collection, filter, NULL, NULL);
mongoc_cursor_next (results, &doc);
char *str = bson_as_canonical_extended_json (doc, NULL);
printf ("%s\n", str);
bson_free (str);
mongoc_cursor_destroy (results);
bson_destroy (filter);
{ "_id" : { "$oid" : "..." }, ... , "name" : "Dunkin' Donuts", "restaurant_id" : "40392410" }

要关闭游标并发布所有关联资源,请调用 mongoc_cursor_destroy() 函数,如以下示例所示:

mongoc_cursor_destroy (cursor);

对固定大小固定大小集合进行查询时,可以使用可可追加游标,该游标在客户端用完游标中的结果后仍保持打开状态。要在固定大小固定大小集合上创建可可追加游标,请在执行查找操作时指定 和tailable awaitData选项。

以下示例在固定大小固定大小集合上创建可可追加游标:

collection = mongoc_client_get_collection (client, "<database>", "<capped collection>");
bson_t *filter = bson_new ();
bson_t *opts = BCON_NEW ("tailable", BCON_BOOL (true),
"awaitData", BCON_BOOL (true));
mongoc_cursor_t *tailable_cursor =
mongoc_collection_find_with_opts(collection, filter, opts, NULL);
// Perform operations with tailable cursor here
mongoc_cursor_destroy (tailable_cursor);
bson_destroy (filter);
bson_destroy (opts);

要学习;了解有关可追加游标及其用法的更多信息,请参阅MongoDB Server手册中的可追加游标指南

MongoDB中的游标如果长时间打开且未对其执行任何操作,则可能会在服务器上超时。当您尝试遍历游标时,这可能会导致 CursorNotFound 异常。要解决此问题,请打开新游标。

要学习;了解有关本指南中讨论的任何函数的更多信息,请参阅以下API文档:

后退

检索不同字段值