gpt4 book ai didi

C++ 驱动程序 mongodb 连接选项

转载 作者:可可西里 更新时间:2023-11-01 09:24:58 24 4
gpt4 key购买 nike

C++ 驱动程序似乎不接受 mongodb 连接 uri 格式。没有关于我应该如何创建连接字符串的文档,任何猜测?

我需要连接到具有 3 个服务器的拷贝集,并设置 readPreference 选项。

最佳答案

在 MongoDB C++ 客户端中创建到拷贝集的连接

直到@acm's answer中解释的问题已解决,我找到了 C++ 驱动程序的错误连接字符串的解决方法。您可以通过这种方式使用主机和端口 vector 创建 DBClientReplicaSet:

//First create a vector of hosts
//( you can ignore port numbers if yours are default)

vector<HostAndPort> hosts;
hosts.push_back(mongo::HostAndPort("YourHost1.com:portNumber1"));
hosts.push_back(mongo::HostAndPort("YourHost2.com:portNumber2"));
hosts.push_back(mongo::HostAndPort("YourHost3.com:portNumber3"));

//Then create a Replica Set DB Client:

mongo::DBClientReplicaSet connection("YourReplicaSetName",hosts,0);

//Connect to it now:

connection.connect();

//Authenticate to the database(s) if needed

std::string errmsg;
connection.auth("DB1Name","UserForDB1","pass1",errmsg);
connection.auth("DB2Name","UserForDB2","pass2",errmsg);

现在,您可以像使用 DBClientConnection 一样使用插入、更新等。为了快速修复,您可以将对 DBClientConnection 的引用替换为 DBClientBase(它是 DBClientConnectionDBClientReplicaSet )

最后一个陷阱:如果您正在使用 getLastError(),则必须像这样将其与目标数据库名称一起使用:

connection.getLastError(std::string("DBName"));

否则它将始终返回“命令失败:必须登录”,如 this JIRA ticket 中所述.

为每个请求设置读取首选项

您有两种方法可以做到这一点:

SlaveOK 选项

它可以将您的读取查询定向到辅助服务器。

它发生在查询选项中,它位于 DBClientReplicaSet.query() 参数的末尾。这些选项列在 Mongo's official documentation

您要寻找的mongo::QueryOption_SlaveOk,它允许您在辅助实例上进行读取。

这就是你应该如何调用 query();

connection.query("Database.Collection",
QUERY("_id" << id),
n,
m,
BSON("SomeField" << 1),
QueryOption_SlaveOk);

其中 n 是要返回的文档数(如果您不希望有任何限制,则为 0),m 是要跳过的文档数(默认为 0),下一个字段是您的预测,最后一个字段是您的查询选项。

要使用多个查询选项,您可以像这样使用按位或|:

connection.query("Database.Collection",
QUERY("_id" << id),
n,
m,
BSON("SomeField" << 1),
QueryOption_SlaveOk | QueryOption_NoCursorTimeout | QueryOption_Exhaust);

Query::readPref 选项

Query object has a readPref为特殊查询设置读取首选项的方法。应该为每个查询调用它。

您可以传递不同的参数以获得更多控制。 They are listed here .

所以这是你应该做的(我没有测试那个,因为我现在不能,但它应该工作得很好)

/* you should pass an array for the tags. Not sure if this is required.
Anyway, let's create an empty array using the builder. */

BSONArrayBuilder bab;

/* if any, add your tags here */

connection.query("Database.Collection",
QUERY("_id" << id).readPref(ReadPreference_SecondaryPreferred, bab.arr()),
n,
m,
BSON("SomeField" << 1),
QueryOption_NoCursorTimeout | QueryOption_Exhaust);

注意:如果使用任何 readPref 选项,它应该覆盖 slaveOk 选项。

希望这对您有所帮助。

关于C++ 驱动程序 mongodb 连接选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14629281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com