数据库和集合
概述
在本指南中,您可以学习如何使用 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 文档
要了解本指南中讨论的任何函数的更多信息,请参阅以下API文档