3

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.

4

4 回答 4

3

在 MongoDB C++ 客户端中创建到副本集的连接

@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. 为了快速修复,您可以替换对DBClientConnectionwith的引用DBClientBase(它是DBClientConnectionand的父级DBClientReplicaSet

最后一个陷阱:如果您使用 getLastError(),则必须将其与目标数据库名称一起使用,如下所示:

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

否则它将始终返回“命令失败:必须登录”,如此 JIRA 票证中所述。

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

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

SlaveOK 选项

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

它发生在查询选项中,位于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 选项

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 选项。

希望这有帮助。

于 2014-05-20T10:03:24.023 回答
2

有关连接字符串格式的详细信息,请参阅连接字符串文档。

(下面的代码链接是 2.2.3 文件)

要将连接字符串与 C++ 驱动程序一起使用,您应该使用ConnectionString该类。您首先ConnectionString::parse使用连接字符串调用静态方法以获取ConnectionString对象。然后调用ConnectionString::connect以获取DBClientBase对象,然后您可以使用该对象发送查询。

至于读取首选项,目前我看不到在 C++ 驱动程序的连接字符串中设置读取首选项的方法,这将排除每个连接的设置。

但是,通过使用标识副本集的字符串DBClientBase调用返回的实现将返回DBClientReplicaSet的实例。该类在查询中获得荣誉,因此您可以在每个查询的基础上设置您的阅读偏好。ConnectionString::parse$readPreference

于 2013-02-01T17:12:07.907 回答
1

由于当前的 C++ 驱动程序仍然不接受标准的 mongodb 连接 URI,我已经打开了一张票: https ://jira.mongodb.org/browse/CXX-2 请投票以帮助解决此问题。

于 2014-01-22T21:46:20.407 回答
0

似乎您可以通过调用 Query 对象的“readPref”方法在发送读取请求之前设置读取首选项。我还没有找到在 mongo 集合对象上设置读取首选项的方法。

于 2013-11-02T10:45:07.773 回答