It seems that c++ drivers doesn't accept mongodb connection uri format. There's no documentation on how i should create connection string, any guess?
I need to connect to a replica set with 3 servers, and set readPreference options.
It seems that c++ drivers doesn't accept mongodb connection uri format. There's no documentation on how i should create connection string, any guess?
I need to connect to a replica set with 3 servers, and set readPreference options.
在@acm 的答案中解释的问题得到解决之前,我已经找到了 C++ 驱动程序的错误连接字符串的解决方法。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
with的引用DBClientBase
(它是DBClientConnection
and的父级DBClientReplicaSet
)
最后一个陷阱:如果您使用 getLastError(),则必须将其与目标数据库名称一起使用,如下所示:
connection.getLastError(std::string("DBName"));
否则它将始终返回“命令失败:必须登录”,如此 JIRA 票证中所述。
你有两种方法可以做到这一点:
它可以让您的读取查询被定向到辅助服务器。
它发生在查询选项中,位于DBClientReplicaSet.query()
. 选项在Mongo 的官方文档中列出
您要查找的是mongo::QueryOption_SlaveOk
,这将允许您在辅助实例上进行读取。
这就是你应该如何调用 query();
connection.query("Database.Collection",
QUERY("_id" << id),
n,
m,
BSON("SomeField" << 1),
QueryOption_SlaveOk);
其中 n 是要返回的文档数(如果您不想要任何限制,则为 0),m 要跳过的数字(默认为 0),下一个字段是您的投影,最后一个是您的查询选项。
要使用多个查询选项,您可以bitwise or |
像这样使用:
connection.query("Database.Collection",
QUERY("_id" << id),
n,
m,
BSON("SomeField" << 1),
QueryOption_SlaveOk | QueryOption_NoCursorTimeout | QueryOption_Exhaust);
Query 对象有一个 readPref方法,它为特殊查询设置读取首选项。应该为每个查询调用它。
您可以传递不同的参数以获得更多控制。它们在此处列出。
所以这就是你应该做的(我没有测试那个原因我现在不能,但它应该可以正常工作)
/* 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 选项。
希望这有帮助。
有关连接字符串格式的详细信息,请参阅连接字符串文档。
(下面的代码链接是 2.2.3 文件)
要将连接字符串与 C++ 驱动程序一起使用,您应该使用ConnectionString
该类。您首先ConnectionString::parse
使用连接字符串调用静态方法以获取ConnectionString
对象。然后调用ConnectionString::connect
以获取DBClientBase对象,然后您可以使用该对象发送查询。
至于读取首选项,目前我看不到在 C++ 驱动程序的连接字符串中设置读取首选项的方法,这将排除每个连接的设置。
但是,通过使用标识副本集的字符串DBClientBase
调用返回的实现将返回DBClientReplicaSet的实例。该类在查询中获得荣誉,因此您可以在每个查询的基础上设置您的阅读偏好。ConnectionString::parse
$readPreference
由于当前的 C++ 驱动程序仍然不接受标准的 mongodb 连接 URI,我已经打开了一张票: https ://jira.mongodb.org/browse/CXX-2 请投票以帮助解决此问题。
似乎您可以通过调用 Query 对象的“readPref”方法在发送读取请求之前设置读取首选项。我还没有找到在 mongo 集合对象上设置读取首选项的方法。