似乎c ++驱动程序不接受mongodb连接uri格式。 没有关于如何创建连接字符串的文档,有什么猜测吗?
我需要连接到包含3台服务器的副本集,并设置readPreference选项。
答案 0 :(得分:3)
在解决@acm's answer中解释的问题之前,我找到了解决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
的引用替换为DBClientBase
(DBClientConnection
和DBClientReplicaSet
的父代)
最后一个陷阱:如果您使用的是getLastError(),则必须将其与目标数据库名称一起使用,如下所示:
connection.getLastError(std::string("DBName"));
否则它将始终返回&#34;命令失败:必须登录&#34;如this JIRA ticket中所述。
您有两种方法可以做到这一点:
它可以将您的读取查询定向到辅助服务器。
它发生在查询选项中,它位于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),下一个字段是您的投影,最后一个是您的查询选项。
要使用多个查询选项,您可以使用bitwise or |
,如下所示:
connection.query("Database.Collection",
QUERY("_id" << id),
n,
m,
BSON("SomeField" << 1),
QueryOption_SlaveOk | QueryOption_NoCursorTimeout | QueryOption_Exhaust);
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选项。
希望这会有所帮助。
答案 1 :(得分:2)
有关连接字符串格式的详细信息,请参阅connection string文档。
(下面的代码链接是2.2.3文件)
要使用带有C ++驱动程序的连接字符串,您应该使用ConnectionString
类。首先使用连接字符串调用ConnectionString::parse
静态方法以获取ConnectionString
对象。然后,您调用ConnectionString::connect
以获取DBClientBase对象,然后您可以使用该对象发送查询。
至于读取首选项,目前我没有看到在C ++驱动程序的连接字符串中设置读取首选项的方法,这将排除每个连接设置。
但是,通过使用标识副本集的字符串调用DBClientBase
返回的ConnectionString::parse
实现将返回DBClientReplicaSet的实例。该类在查询中表示$readPreference
,因此您可以基于每个查询设置读取首选项。
答案 2 :(得分:1)
由于当前的C ++驱动程序仍然不接受标准的mongodb连接URI,我打开了一张票: https://jira.mongodb.org/browse/CXX-2 请投票支持以解决此问题。
答案 3 :(得分:0)
似乎您可以在通过调用&#34; readPref&#34;发送读取请求之前设置读取首选项。 Query对象的方法。我还没有找到在mongo集合对象上设置读取首选项的方法。