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

时间:2013-01-31 15:28:46

标签: c++ mongodb connection-string

似乎c ++驱动程序不接受mongodb连接uri格式。 没有关于如何创建连接字符串的文档,有什么猜测吗?

我需要连接到包含3台服务器的副本集,并设置readPreference选项。

4 个答案:

答案 0 :(得分:3)

创建与MongoDB C ++客户端

中的副本集的连接

在解决@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的引用替换为DBClientBaseDBClientConnectionDBClientReplicaSet的父代)

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

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

否则它将始终返回&#34;命令失败:必须登录&#34;如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),下一个字段是您的投影,最后一个是您的查询选项。

要使用多个查询选项,您可以使用bitwise or |,如下所示:

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

希望这会有所帮助。

答案 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集合对象上设置读取首选项的方法。