文档菜单
文档首页
/ / /
C驱动程序

数据库和集合

在本页

  • 概述
  • 访问数据库
  • 访问集合
  • 创建集合
  • 获取集合列表
  • 删除集合
  • 配置读写操作
  • 标签集
  • 本地阈值
  • API 文档

在本指南中,您可以学习如何使用 C 驱动程序与 MongoDB 数据库和集合进行交互。

MongoDB 将数据组织为以下级别的层次结构

  • 数据库:MongoDB 部署中的顶级数据结构,用于存储集合。

  • 集合:MongoDB 文档的组。它们与关系数据库中的表类似。

  • 文档:存储诸如字符串、数字、日期和其他嵌入文档等字面数据的单元。有关文档字段类型和结构的更多信息,请参阅 MongoDB 服务器手册中的文档指南。

使用mongoc_client_get_database()函数访问数据库。

以下示例访问名为 "test_database" 的数据库

mongoc_database_t *database = mongoc_client_get_database (client, "test_database");

通过使用 mongoc_client_get_collection()mongoc_database_get_collection() 函数来访问集合。

以下示例通过使用 mongoc_database_get_collection() 函数访问名为 "test_collection" 的集合

mongoc_collection_t *collection = mongoc_database_get_collection (database, "test_collection");

提示

如果提供的集合名称在数据库中尚不存在,当您首次向其中插入数据时,MongoDB 会隐式创建该集合。

使用 mongoc_database_create_collection() 函数在 MongoDB 数据库中显式创建集合。

以下示例创建一个名为 "example_collection" 的集合

mongoc_collection_t *new_collection = mongoc_database_create_collection (database, "example_collection", NULL, &error);

您可以通过将它们作为 bson_t 结构的参数传递给 mongoc_database_create_collection() 函数的第三个参数来指定集合选项,例如最大大小和文档验证规则。有关完整选项列表,请参阅 MongoDB 服务器手册中的 create 命令 文档。

您可以通过调用 mongoc_database_find_collections_with_opts() 函数来查询数据库中的集合列表。该函数返回一个包含数据库中所有集合及其相关元数据的游标。

以下示例调用 mongoc_database_find_collections_with_opts() 函数并遍历游标以打印结果

mongoc_cursor_t *cursor = mongoc_database_find_collections_with_opts (database, NULL);
const bson_t *doc;
while (mongoc_cursor_next (cursor, &doc))
{
char *str = bson_as_canonical_extended_json (doc, NULL);
printf ("Collection: %s\n", str);
bson_free (str);
}
Collection: { "name" : "test_collection", "type" : "collection", ...}
Collection: { "name" : "example_collection", "type" : "collection", ... }

要查询数据库中集合的名称,请按以下方式调用 mongoc_database_get_collection_names_with_opts() 函数

char **strv;
unsigned i;
if ((strv = mongoc_database_get_collection_names_with_opts (database, NULL, &error)))
{
for (i = 0; strv[i]; i++)
printf ("%s\n", strv[i]);
bson_strfreev (strv);
}
else
{
fprintf (stderr, "Command failed: %s\n", error.message);
}
test_collection
example_collection

有关遍历游标的更多信息,请参阅从游标获取数据.

您可以使用 mongoc_collection_drop() 函数从数据库中删除集合。

以下示例演示了如何删除 "test_collection" 集合

mongoc_collection_t *collection = mongoc_database_get_collection (database, "test_collection");
mongoc_collection_drop (collection, NULL);

警告

删除集合将删除集合中的所有数据

从您的数据库中删除集合将永久删除该集合中的所有文档和索引。

只有在不再需要该数据时才删除集合。

您可以通过设置 读取偏好 来控制驱动程序如何路由读取操作。您还可以通过设置 读取关注写入关注 来控制驱动程序等待副本集对读取和写入操作的确认的方式。

默认情况下,数据库从 mongoc_client_t 实例继承这些设置,集合从数据库继承这些设置。但是,您可以通过以下函数之一更改这些设置

  • mongoc_database_set_read_prefs()

  • mongoc_database_set_read_concern()

  • mongoc_database_set_write_concern()

以下示例展示了如何使用 mongoc_database_set_read_prefs() 函数更改数据库的读取偏好

mongoc_read_prefs_t *read_prefs = mongoc_read_prefs_new (MONGOC_READ_PRIMARY_PREFERRED);
mongoc_database_set_read_prefs (database, read_prefs);

您可以使用以下函数之一更改集合的读取和写入设置

  • mongoc_collection_set_read_prefs()

  • mongoc_collection_set_read_concern()

  • mongoc_collection_set_write_concern()

以下示例展示了如何使用 mongoc_collection_set_read_prefs() 函数更改集合的读取偏好

mongoc_read_prefs_t *read_prefs = mongoc_read_prefs_new (MONGOC_READ_PRIMARY_PREFERRED);
mongoc_collection_set_read_prefs(collection, read_prefs);

提示

要查看可用的读取偏好类型,请参阅API 文档。

要了解更多关于读取和写入设置的信息,请参阅 MongoDB 服务器手册中的以下指南

在 MongoDB 服务器中,您可以根据您选择的任何标准将键值标签应用于副本集成员。然后,您可以使用这些标签来指定一个或多个成员进行读取操作。

默认情况下,C 驱动程序在选择读取成员时会忽略标签。要指示 C 驱动程序优先考虑某些标签,请使用 mongoc_read_prefs_set_tags() 函数将标签设置在 mongoc_read_prefs_t 实例中。

在以下代码示例中,传递给 mongoc_read_prefs_set_tags() 函数的标签集指示 C 驱动程序优先从纽约数据中心('dc': 'ny')读取,并在需要时回退到旧金山数据中心('dc': 'sf'

mongoc_read_prefs_t *read_prefs = mongoc_read_prefs_new (MONGOC_READ_SECONDARY_PREFERRED);
bson_t *tags = BCON_NEW ("DC", BCON_UTF8("ny"), "DC", BCON_UTF8("sf"));

如果有多个副本集成员匹配您指定的读取偏好和标签集,C 驱动程序将根据它们的ping时间从最近的副本集成员读取。

默认情况下,驱动程序仅使用那些ping时间在最近成员15毫秒之内的成员进行查询。为了在具有较高延迟的成员之间分配读取,请将 localThresholdMS 参数包含在您的连接字符串URI中。

以下示例连接到运行在 localhost:27017 的MongoDB部署,并指定了35毫秒的本地阈值。

const char *uri_string = "mongodb://localhost:27017/?localThresholdMS=35";
mongoc_client_t *client = mongoc_client_new (uri_string);

在前面的示例中,C驱动程序在距离最近成员ping时间35毫秒内的匹配成员之间分配读取。

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

返回

配置传输层安全性 (TLS)