数据库与集合
概述
本指南介绍了如何使用C++驱动程序与MongoDB数据库和集合进行交互。
MongoDB将数据组织为以下级别的层次结构
数据库:MongoDB部署中的顶级数据结构,用于存储集合。
集合:MongoDB文档的组。它们类似于关系数据库中的表。
文档:存储诸如字符串、数字、日期和其他嵌入文档等字面数据的单元。有关文档字段类型和结构的更多信息,请参阅MongoDB服务器手册中的文档指南。
访问数据库
您可以通过调用一个名为mongocxx::client
的对象上的database()
函数,并传递数据库名称作为参数来访问数据库。database()
函数的例子如下:
以下示例访问名为"test_database"
的数据库
auto db = client.database("test_database");
或者,您可以使用[]
运算符在mongocxx::client
上作为database()
函数的简写,如下代码所示
auto db = client["test_database"];
访问集合
您可以通过在名为mongocxx::database
的对象上调用collection()
函数并传递集合名称作为参数来访问集合。
以下示例访问名为"test_collection"
的集合
auto coll = database.collection("test_collection");
或者,您可以在一个 mongocxx::database
上使用 []
操作符作为 collection()
函数的简写,如下所示:
auto coll = database["test_collection"];
提示
如果提供的集合名称在数据库中不存在,当您第一次向其中插入数据时,MongoDB 会隐式地创建该集合。
创建集合
您可以使用 create_collection()
函数在 MongoDB 数据库中显式创建一个集合。
以下示例创建了一个名为 "example_collection"
的集合。
auto coll = database.create_collection("example_collection");
您可以通过将它们作为 BSON 文档的第二个参数传递给 create_collection()
函数来指定集合选项,例如最大大小和文档验证规则。有关所有可选参数的完整列表,请参阅 MongoDB 服务器手册中的 create 命令 文档。
获取集合列表
您可以通过调用 list_collections()
函数来检索数据库中的集合列表。该函数返回一个包含数据库中所有集合及其相关元数据的游标。
以下示例调用 list_collections()
函数并遍历游标以打印结果。
auto cursor = database.list_collections(); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
Collection: { "name" : "test_collection", "type" : "collection", ...} Collection: { "name" : "example_collection", "type" : "collection", ... }
要查询数据库中集合的名称,请调用 list_collection_names()
函数,如下例所示。
auto list = database.list_collection_names(); for(auto&& name : list) { std::cout << name << std::endl; }
test_collection example_collection
有关遍历游标的信息,请参阅从游标访问数据指南。
删除集合
您可以使用drop()
函数从数据库中删除集合。
以下示例删除了"test_collection"
集合
auto coll = database["test_collection"]; coll.drop();
警告
删除集合会删除集合中的所有数据
从数据库中删除集合会永久删除该集合中的所有文档和所有索引。
只有当集合中的数据不再需要时,才删除集合。
配置读写操作
您可以通过设置读取偏好来控制驱动程序如何路由读取操作。您还可以通过设置读取关注和写入关注来控制驱动程序在副本集上等待读取和写入操作确认的选项。
默认情况下,数据库从mongocxx::client
对象继承这些设置,集合从数据库继承这些设置。但是,您可以通过以下函数之一在数据库或集合上更改这些设置
read_preference()
read_concern()
write_concern()
有关读取和写入设置的更多信息,请参阅MongoDB服务器手册中的以下指南
配置数据库设置
以下示例展示了如何使用以下函数配置数据库的读取设置:
read_preference()
:将读取优先级设置为k_secondary
read_concern()
:将读取关注点设置为k_majority
auto db = client["test_database"]; mongocxx::read_preference rp; rp.mode(mongocxx::read_preference::read_mode::k_secondary); mongocxx::read_concern rc; rc.acknowledge_level(mongocxx::read_concern::level::k_majority); db.read_preference(rp); db.read_concern(rc);
配置集合设置
以下示例展示了如何使用以下函数指定集合的读取和写入关注点:
read_concern()
:将读取关注点设置为k_local
write_concern()
:将写入关注点设置为k_acknowledged
auto coll = client["test_database"]["test_collection"]; mongocxx::read_concern rc; rc.acknowledge_level(mongocxx::read_concern::level::k_local); mongocxx::write_concern wc; wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged); coll.read_concern(rc); coll.write_concern(wc);
标签集
在MongoDB服务器中,您可以根据任何选择的准则将键值标签应用于副本集成员。然后,您可以使用这些标签针对一个或多个成员进行读取操作。
默认情况下,C++ 驱动在读取成员时忽略标签。要指导 C++ 驱动优先考虑某些标签,创建一个 mongocxx::read_preference
对象并调用其 tags()
成员函数。将您首选的标签作为数组参数传递给 tags()
。
以下代码示例中,传递给 tags()
函数的标签集指示 C++ 驱动优先从纽约数据中心("dc": "ny"
)读取,并回退到旧金山数据中心("dc": "sf"
)
auto tag_set_ny = make_document(kvp("dc", "ny")); auto tag_set_sf = make_document(kvp("dc", "sf")); mongocxx::read_preference rp; rp.mode(mongocxx::read_preference::read_mode::k_secondary); rp.tags(make_array(tag_set_ny, tag_set_sf).view());
本地阈值
如果多个副本集成员匹配您指定的读取偏好和标签集,C++ 驱动将根据其 ping 时间读取最近的副本集成员。
默认情况下,驱动程序仅使用与最近成员 ping 时间相差 15 毫秒以内的成员进行查询。为了在具有更高延迟的成员之间分配读取,请将 localThresholdMS
参数包含在您的连接字符串 URI 中。
以下示例连接到运行在 localhost:27017
的 MongoDB 部署,并指定 35 毫秒的本地阈值
mongocxx::uri uri("mongodb://localhost:27017/?localThresholdMS=35"); mongocxx::client client(uri);
在上面的示例中,C++ 驱动在距离最近成员 ping 时间 35 毫秒以内的匹配成员之间分配读取。
API 文档
要了解本指南中讨论的任何函数的更多信息,请参阅以下 API 文档