数据库和集合
Overview
在本指南中,您可以学习;了解如何使用C驾驶员与MongoDB数据库和集合进行交互。
MongoDB 将数据组织成以下级别的层次结构:
数据库: MongoDB 部署中用于存储集合的顶级数据结构。
集合: MongoDB文档组。 它们类似于关系数据库中的表。
文档:存储字面数据(例如string 、数字、日期和其他嵌入式文档)的单位。 有关文档字段类型和结构的更多信息,请参阅MongoDB Server手册中的文档指南。
访问数据库
使用 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"
的collection:
mongoc_collection_t *new_collection = mongoc_database_create_collection (database, "example_collection", NULL, &error);
您可以指定集合选项,例如最大大小和文档验证规则,方法是将它们传递到bson_t
结构中作为mongoc_database_create_collection()
函数的第三个参数。有关可选参数的完整列表,请参阅MongoDB Server手册中的创建命令文档。
获取集合列表
您可以通过调用 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()
函数更改数据库的读取偏好(read preference):
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()
函数更改集合的读取偏好(read preference):
mongoc_read_prefs_t *read_prefs = mongoc_read_prefs_new (MONGOC_READ_PRIMARY_PREFERRED); mongoc_collection_set_read_prefs(collection, read_prefs);
要了解有关读取和写入设置的更多信息,请参阅 MongoDB Server 手册中的以下指南:
标签集
在MongoDB Server中,您可以根据您选择的任何条件应用键值标签应用于副本集成员。然后,您可以使用这些标签来定位一个或多个成员以执行读取操作。
默认, 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"));
LocalThreshold
如果多个副本集成员与您指定的读取偏好(read preference)和标签集匹配,则C驾驶员将从根据其网络探测(ping)时间选择的最近副本集成员中读取。
默认,驾驶员仅使用 ping 时间与最近节点的网络探测(ping)时间在 15 毫秒以内的节点进行查询。要在延迟较高的成员之间分配读取,请在连接字符串URI 中包含 localThresholdMS
参数。
以下示例连接到在 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文档: