Overview
在本指南中,您可以学习;了解如何配置写关注(write concern)、读关注(read concern)和读取偏好(read preference)选项,以修改C++驾驶员在副本集上运行写入操作的方式。
读取和写入设置优先级
您可以在以下级别设置写关注、读关注和读取偏好选项:
事务
Database
Collection
此列表还指示了选项设置的优先级递增顺序。示例,如果为数据库设立读关注(read concern),它将覆盖从ACID 事务继承的读关注(read concern)设置。
配置读取和写入操作
您可以通过设置读取偏好来控制驱动程序路由读取操作的方式。 您还可以通过设置读关注和写关注来控制驱动程序如何等待副本集上读写操作确认的选项。
要学习;了解有关读取和写入设置及其选项的更多信息,请参阅MongoDB Server手册中的以下指南:
有关默认读取和写入设置的信息,请参阅MongoDB Server手册中的默认MongoDB读关注/写关注。
事务配置
事务在会话中运行,会话是要按顺序运行的相关读取或写入操作的分组。使用start_session() 方法获取用于事务的会话。然后,将mongocxx::options::transaction 对象传递给会话的with_transaction() 方法。此示例演示如何设立ACID 事务的读取偏好(read preference)、读关注(read concern)和写关注(write concern)。
该示例配置了以下设置:
k_primary读取偏好(read preference):读取操作从主节点 (primary node in the replica set)副本集成员检索数据。k_majority读关注(read concern):读取操作返回实例已写入大多数副本集成员的最新数据。k_acknowledged写关注(write concern):主节点 (primary node in the replica set)副本集成员必须确认写入操作。
auto session = client.start_session(); mongocxx::options::transaction txn_opts; { mongocxx::read_preference rp; mongocxx::read_concern rc; mongocxx::write_concern wc; rp.mode(mongocxx::read_preference::read_mode::k_primary); rc.acknowledge_level(mongocxx::read_concern::level::k_majority); wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged); txn_opts.read_preference(rp); txn_opts.read_concern(rc); txn_opts.write_concern(wc); } session.with_transaction([&](mongocxx::client_session*) { // Specify transaction operations here }, txn_opts);
数据库配置
此示例展示了如何为数据库配置以下读取设置:
k_secondary读取偏好(read preference):读取操作仅从从节点(secondary node from replica set)副本集成员中检索数据。k_majority读关注(read concern):读取操作返回实例已写入大多数副本集成员的最新数据。
auto db = client["test_database"]; mongocxx::read_preference rp; mongocxx::read_concern rc; rp.mode(mongocxx::read_preference::read_mode::k_secondary); rc.acknowledge_level(mongocxx::read_concern::level::k_majority); db.read_preference(rp); db.read_concern(rc);
集合配置
此示例展示了如何为集合指定以下读关注和写关注(write concern)设置:
k_local读关注(read concern):读取操作会返回实例的最新数据,但不保证该数据已写入大多数副本集成员。k_acknowledged写关注(write concern):主节点 (primary node in the replica set)副本集成员必须确认写入操作。
auto coll = client["test_database"]["test_collection"]; mongocxx::read_concern rc; mongocxx::write_concern wc; rc.acknowledge_level(mongocxx::read_concern::level::k_local); wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged); coll.read_concern(rc); coll.write_concern(wc);
标签集
在MongoDB Server中,您可以根据您选择的任何条件将键值标签应用副本集成员。然后,您可以使用这些标签来定位一个或多个成员以执行读取操作。
默认下, 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++驾驶员会自动重试一次。
您可以通过在连接 URI 中将 retryReads 或 retryWrites 选项设置为 false 来显式禁用可重试读取或可重试写入。以下示例为客户端禁用可重试读取和写入:
mongocxx::uri uri{"mongodb://localhost:27017/?retryReads=false&retryWrites=false"}; mongocxx::client client{uri};
要学习;了解有关支持的可重试写入操作的更多信息,请参阅MongoDB Server手册中的以下指南:
负载均衡
连接到分片集群或副本集时, C++驾驶员使用负载均衡来处理读取和写入请求。负载均衡允许驾驶员将这些请求分发到多台服务器,从而避免任何一台服务器不堪重负,确保最佳性能。
连接到分片集群时, C++驾驶员会计算网络往返时间最短的实例,从而确定最接近的mongos 实例。然后,驾驶员通过将此mongos 的平均往返时间与 localThresholdMS 值相加来确定延迟窗口。驾驶员在延迟窗口内的最多两个随机mongos 实例之间对请求进行负载均衡。对于每个请求,驾驶员会通过确定其operationCount 值来选择具有较低操作负载的服务器。
连接到副本集时, C++驾驶员首先根据读取偏好(read preference)副本集成员。然后,驾驶员执行与上一段所述相同的进程。计算延迟窗口后,驾驶员最多选择两个处于该窗口内的随机副本集节点,并选择具有较低 operationCount 值的节点来接收请求。
提示
要学习;了解有关负载均衡的更多信息,请参阅MongoDB Server手册中的分片集群负载均衡器。
LocalThreshold
C++驾驶员使用本地阈值来计算服务器选择的延迟窗口。此值确定有资格接收读取和写入请求的服务器。
默认下,驾驶员仅使用网络探测(ping)时间在最近服务器的 15 毫秒以内的 mongos 实例或副本集成员。要在延迟较高的服务器之间分配读取操作,请在连接 URI 中设立localThreshold 参数。
注意
从单个mongos 实例选择副本集成员时, C++驾驶员会忽略localThresholdMS 选项。在这种情况下,请使用 localThreshold 命令行选项。
以下示例连接到副本集并指定 35 毫秒的本地阈值:
mongocxx::uri uri{"mongodb://localhost:27017/?replicaSet=repl0&localThresholdMS=35"}; mongocxx::client client{uri};
在前面的示例中, C++驾驶员在最近成员的网络探测(ping)时间的 35 毫秒内在匹配成员之间分配读取。
排序规则
对集合执行写入操作时,可以指定排序规则。
排序规则是一设立特定于语言的字符串比较规则,例如字母大小写和重音符号规则。
要指定排序规则,请将排序规则定义传递给选项对象的 collation() 方法,然后将此选项对象传递给读取或写入操作。
排序规则示例
考虑包含以下文档的集合:
{ _id: 1, category: "café" }, { _id: 2, category: "cafe" }, { _id: 3, category: "cafE" }
以下示例创建了一个排序规则,该排序规则指定法语区域设置设置并忽略大小写和字母变体之间的差异。然后,它使用此排序规则来查找 category字段值与 "cafe" 匹配的文档。由于指定的排序规则,查询将返回所有三个文档。
mongocxx::options::find opts{}; opts.collation(bsoncxx::from_json(R"({"locale": "fr", "strength": 1})")); auto cursor = collection.find(make_document(kvp("category", "cafe")), opts); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id": { "$oid" : "1" }, "category": "café" } { "_id": { "$oid" : "2" }, "category": "cafe" } { "_id": { "$oid" : "3" }, "category": "cafE" }
API 文档
要学习;了解有关本指南中讨论的任何类或方法的更多信息,请参阅以下API文档: