3

C++ ドライバーは mongodb 接続 uri 形式を受け入れないようです。接続文字列を作成する方法に関するドキュメントはありません。

3 台のサーバーを含むレプリカ セットに接続し、readPreference オプションを設定する必要があります。

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);

これで、 で行ったのと同じように、挿入、更新などを使用できますDBClientConnectionDBClientConnection簡単な修正として、 への参照を(とDBClientBaseの両方の親である)に置き換えることができます。DBClientConnectionDBClientReplicaSet

最後の落とし穴: getLastError() を使用している場合は、次のように目的のデータベース名で使用する必要があります。

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

そうしないと、この JIRA チケットで説明されているように、常に「コマンドが失敗しました: ログインが必要です」が返されます。

すべてのリクエストの読み取り設定を設定する

これを行うには 2 つの方法があります。

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メソッドがあります。クエリごとに呼び出す必要があります。

より詳細に制御するために、さまざまな引数を渡すことができます。それらはここにリストされています

したがって、ここであなたがすべきことです(私は今はできない1つの原因をテストしていませんが、うまくいくはずです)

/* 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オブジェクトを取得します。次に、呼び出してDBClientBaseConnectionString::connectオブジェクトを取得し、それを使用してクエリを送信します。

読み取り設定に関しては、現時点では、C++ ドライバーの接続文字列で読み取り設定を設定する方法がわかりません。これにより、接続ごとの設定が妨げられます。

ただし、レプリカ セットを識別する文字列でDBClientBase呼び出すことによって返されるの実装は、 DBClientReplicaSetのインスタンスを返します。このクラスはクエリで優先されるため、クエリごとに読み取り設定を設定できます。ConnectionString::parse$readPreference

于 2013-02-01T17:12:07.907 に答える
0

クエリオブジェクトの「readPref」メソッドを呼び出すことで、読み取りリクエストを送信する前に読み取り設定を設定できるようです。mongo コレクション オブジェクトに読み取り設定を設定する方法はまだ見つかりません。

于 2013-11-02T10:45:07.773 に答える