AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

CRUD操作の構成

このガイドでは、書込み保証 (write concern)読み取り保証 (read concern)、 読み込み設定( 読み込み設定 (read preference) ) オプションを構成して、 MongoDB PHPライブラリがレプリカセットに対して作成、読み取り、アップデート、削除( CRUD )操作を実行する方法を変更する方法を説明します。

次のレベルで、書込み保証、読み取り保証、読み込み設定(read preference)のオプションを設定できます。

  • クライアント(オーバーライドされない限り、すべての操作実行にデフォルトを設定します)

  • セッション

  • トランザクション

  • Database

  • コレクション

このリストは、オプション設定の優先順位の増加順も示しています。 例、トランザクションに読み取り保証 (read concern)レベルを設定すると、クライアントから継承された読み取り保証 (read concern)レベルが上書きされます。

これらのオプションを使用すると、レプリカセット内のデータの因果整合性と可用性をカスタマイズできます。 読み込み設定( 読み込み設定 (read preference)) 、 読み取り保証( 読み取り保証 (read concern)) 、 書込み保証( 書込み保証 (write concern) ) オプションの完全なリストを表示するには、 MongoDB Serverマニュアルの次のガイドを参照してください。

ライブラリが読み取り操作をルーティングする方法は、 読み込み設定( 読み込み設定 (read preference)) を設定することで制御できます。 また、読み取りおよび書込み保証を設定して、ライブラリがレプリカセットに対する読み取りおよび書込み操作の確認を待機する方法も制御できます。

このセクションでは、オプション配列パラメーターを次のいずれかのメソッドに渡すことで、 読み込み設定( 読み込み設定 (read preference)) 、 読み取り保証( 読み取り保証 (read concern)) 、 書込み保証( 書込み保証 (write concern) ) をさまざまなレベルで構成する方法を示します。

この例では、 コンストラクターに配列を渡すことで、 MongoDB\Clientインスタンスの読み込み設定( 読み込み設定 (read preference))、読み取り保証( 読み取り保証 (read concern))、書込み保証 (write concern)(write concern)を設定する方法を示しています。 このコードは、次の設定を構成します。

  • secondary 読み込み設定 ( 読み込み設定 (read preference)) : 読み取り操作は セカンダリレプリカセットメンバーからデータを取得します

  • local 読み取り保証 (read concern)保証 : 読み取り操作は、インスタンスの最新データを返しますが、レプリカセットのノードの過半数にデータが書き込まれたことを保証します

  • 2 書込み保証 ( 書込み保証 (write concern)) : プライマリと 1 つのセカンダリレプリカセットノードは、書込み (write)操作を確認する必要があります

$clientOptions = [
'readPreference' => 'secondary',
'readConcernLevel' => 'local',
'w' => '2',
];
$client = new Client('mongodb://localhost:27017', $clientOptions);

あるいは、接続 URI で読み取り設定と書込み設定を指定することもできます。これはMongoDB\Clientコンストラクターにパラメーターとして渡されます。

$uri = 'mongodb://localhost:27017/?readPreference=secondary&readConcernLevel=local&w=2';
$client = new Client($uri);

注意

readPreferencereadConcernLevel 、およびwクライアントオプションは string 値を受け入れます。 読み取りと書込みの設定を他のレベルで構成する場合は、対応するオプションにMongoDB\Driver\ReadPreferenceMongoDB\Driver\ReadConcernMongoDB\Driver\WriteConcernタイプの値を割り当てる必要があります。

この例では、 startSession()メソッドに配列を渡すことで、セッションの 読み込み設定( 読み込み設定 (read preference)) 、 読み取り保証( 読み取り保証 (read concern)) 、書込み保証 (write concern)(write concern) を設定する方法を示しています。 このコードは、次の設定を構成します。

  • PRIMARY_PREFERRED 読み込み設定 ( 読み込み設定 (read preference)) : 読み取り操作は、プライマリレプリカセットメンバーからデータを取得します。プライマリが使用できない場合は セカンダリ メンバーからデータが取得されます

  • LOCAL 読み取り保証 (read concern)保証 : 読み取り操作は、インスタンスの最新データを返しますが、レプリカセットのノードの過半数にデータが書き込まれたことを保証します

  • MAJORITY 書込み保証( 書込み保証 (write concern) ) : すべてのレプリカセットの過半数が書込み(write)操作を確認する必要があります

$sessionOptions = [
'readPreference' => new ReadPreference(ReadPreference::PRIMARY_PREFERRED),
'readConcern' => new ReadConcern(ReadConcern::LOCAL),
'writeConcern' => new WriteConcern(WriteConcern::MAJORITY),
];
$session = $client->startSession($sessionOptions);

この例では、 startTransaction()メソッドに配列を渡すことで、トランザクションの 読み込み設定( 読み込み設定 (read preference)) 、 読み取り保証( 読み取り保証 (read concern)) 、書込み保証 (write concern)(write concern) を設定する方法を示しています。 このコードは、次の設定を構成します。

  • PRIMARY 読み込み設定 ( 読み込み設定 (read preference)) : 読み取り操作は、 プライマリレプリカセットメンバーからデータを取得します

  • MAJORITY 読み取り保証 (read concern): 読み取り操作は、レプリカセットの過半数に書き込まれたインスタンスの最新データを返します

  • 1 書込み保証 ( 書込み保証 (write concern)) : プライマリレプリカセットノードは書込み (write)操作を確認する必要があります

$transactionOptions = [
'readPreference' => new ReadPreference(ReadPreference::PRIMARY),
'readConcern' => new ReadConcern(ReadConcern::MAJORITY),
'writeConcern' => new WriteConcern(1),
];
$session->startTransaction($transactionOptions);

この例では、オプション配列をgetDatabase()メソッドに渡すことで、 test_databaseというデータベースの読み込み設定( 読み込み設定 (read preference))、読み取り保証( 読み取り保証 (read concern))、書込み保証 (write concern)(write concern)を設定する方法を示します。 このコードは、次の設定を構成します。

  • PRIMARY_PREFERRED 読み込み設定 ( 読み込み設定 (read preference)) : 読み取り操作は、プライマリレプリカセットメンバーからデータを取得します。プライマリが使用できない場合は セカンダリ メンバーからデータが取得されます

  • AVAILABLE 読み取り保証 (read concern)保証 : 読み取り操作は、インスタンスの最新データを返しますが、レプリカセットのノードの過半数にデータが書き込まれたことを保証します

  • MAJORITY 書込み保証( 書込み保証 (write concern) ) : すべてのレプリカセットの過半数が書込み(write)操作を確認する必要があります

$db = $client->getDatabase('test_database', [
'readPreference' => new ReadPreference(ReadPreference::PRIMARY_PREFERRED),
'readConcern' => new ReadConcern(ReadConcern::AVAILABLE),
'writeConcern' => new WriteConcern(WriteConcern::MAJORITY),
]);

この例では、オプション配列をgetCollection()メソッドに渡すことで、 test_collectionというコレクションの読み込み設定( 読み込み設定 (read preference))、読み取り保証( 読み取り保証 (read concern))、書込み保証 (write concern)(write concern)を設定する方法を示します。 このコードは、次の設定を構成します。

  • SECONDARY_PREFERRED 読み込み設定 ( 読み込み設定 (read preference)) : 読み取り操作は、セカンダリレプリカセットメンバーからデータを取得します。セカンダリが使用できない場合は、プライマリ ノードからデータが取得されます。

  • AVAILABLE 読み取り保証 (read concern)保証 : 読み取り操作は、インスタンスの最新データを返しますが、レプリカセットのノードの過半数にデータが書き込まれたことを保証します

  • 0 書込み保証 ( 書込み保証 (write concern)) : 書込み (write)操作の確認応答を要求しません

$collection = $client->getCollection('test_database', 'test_collection', [
'readPreference' => new ReadPreference(ReadPreference::SECONDARY_PREFERRED),
'readConcern' => new ReadConcern(ReadConcern::AVAILABLE),
'writeConcern' => new WriteConcern(0),
]);

このセクションでは、次の方法で読み取り操作設定をさらにカスタマイズする方法を説明します。

MongoDB Serverでは、選択した任意の基準に従ってレプリカセット メンバーにキーと値のタグを適用できます。 次に、それらのタグを使用して、1 つ以上のノードを 読み取り操作の対象にすることができます。

デフォルトでは 、 MongoDB PHPライブラリは、読み取り元ノードを選択するときに タグを無視します。 MongoDB PHPライブラリに特定のタグを優先するように指定するには、それらをMongoDB\Driver\ReadPreferenceクラスコンストラクターにパラメーターとして渡します。 次に、 MongoDB\Driver\ReadPreferenceオブジェクトをreadPreferenceデータベースオプションの値として設定します。

米国の複数のデータセンターでホストされているノードを含むレプリカセットに接続しているとします。 このコード例では、 readPreferenceオプションをタグセットに設定し、セカンダリレプリカセットメンバーからの読み取りを次の順序で優先するようtest_databaseに指示します。

  1. ニューヨークデータセンターのメンバー( ['dc' => 'ny']

  2. サンフランシスコデータセンターのメンバー( ['dc' => 'sf']

  3. 任意のセカンダリ ノード( []

$readPreference = new ReadPreference(
ReadPreference::RP_SECONDARY,
[
['dc' => 'ny'],
['dc' => 'sf'],
[],
],
);
$db = $client->getDatabase(
'test_database',
['readPreference' => $readPreference],
);

シャーディングされたクラスターまたはレプリカセットに接続する場合、 PHPライブラリは負荷分散を使用して読み取りおよび書込みリクエストを処理します。負荷バランシングにより、ライブラリはこれらのリクエストを複数のサーバーに分散して、1 つのサーバーが過負荷になるのを回避し、最適なパフォーマンスを確保できます。

シャーディングされたクラスターに接続する場合、 PHPライブラリは、ネットワーク ラウンド トリップ時間が最も短いインスタンスを計算して、最も近い mongosインスタンスを決定します。次に、ライブラリはこの mongos の平均ラウンドトリップ時間を localThresholdMS 値 に追加してレイテンシウィンドウを決定します。ライブラリは、レイテンシウィンドウ内の最大 2 つのランダムな mongos インスタンスにわたってリクエストを分散します。ライブラリは、リクエストごとに、operationCount 値を決定し、操作負荷がより低いサーバーを選択します。

レプリカセットに接続すると、 PHPライブラリはまず読み込み設定 (read preference)に従ってレプリカセットメンバーを選択します。その後、ライブラリは前のセクションで説明されているのと同じプロセスに従います。レイテンシウィンドウを計算した後、ライブラリはウィンドウ内にあるランダムなレプリカセットメンバーを最大 2 つ選択し、リクエストを受信するために operationCount 値が低いメンバーを選択します。

Tip

負荷分散の詳細については、 MongoDB Serverマニュアルのシャードクラスタのバランサーを参照してください。

ライブラリのサーバー選択動作をカスタマイズする方法については、 接続オプションの指定ガイドの「サーバー選択と検出オプション」を参照してください。

PHPライブラリは、ローカルしきい値を使用して、サーバー選択のレイテンシウィンドウを計算します。この値により、読み取りリクエストと書込みリクエストを受信する資格のあるサーバーが決まります。

プライマリ以外の読み込み設定 (read preference) を持つレプリカセットに接続すると、ドライバーはレイテンシーウィンドウ内の最も近い適格なレプリカセットから読み込みます。シャーディングされたクラスターに接続すると、ドライバーはレイテンシーウィンドウ内のアクセス可能なすべての mongos インスタンスから選択します。読み込み設定 (read preference) モードの詳細については、「読み込み設定 (read preference)」を参照してください。

デフォルトで、ドライバーは最も近い適格なサーバーの ping 時間が 15 ミリ秒以内であるサーバーのみを使用します。

例えば、レプリカセットに 5 つのノードがあり、最も近いノードの ping 時間が 5 ミリ秒であるとします。デフォルトの localThresholdMS が 15 ミリ秒の場合、次の表に示すように、ping 時間が 20 ミリ秒以下のノードのみがレイテンシ ウィンドウ内にあります。

Host
タイプ
ping 時間
レイテンシ ウィンドウ内

host1

原発

5ミリ秒

はい

host2

セカンダリ

9ミリ秒

はい

host3

セカンダリ

13ミリ秒

はい

host4

セカンダリ

24ミリ秒

No

host5

セカンダリ

42ミリ秒

No

レイテンシ ウィンドウを調整するには、localThresholdMS オプションを設定するオプション配列を MongoDB\Client コンストラクタに渡します。

次の例えでは、 35ミリ秒のローカルしきい値を指定します。

$options = [
'replicaSet' => 'repl0',
'readPreference' => new ReadPreference(ReadPreference::RP_SECONDARY_PREFERRED),
'localThresholdMS' => 35,
];
$client = new Client('mongodb://localhost:27017', [], $options);

前の例では、 MongoDB PHPライブラリは、最も近いメンバーのping時間の35ミリ秒以内に、一致するメンバーに読み取りを分散します。

注意

MongoDB PHPライブラリは、 mongosインスタンスを介してレプリカセットと通信する場合、 localThresholdMSの値を無視します。 この場合は、 localThresholdコマンドライン オプション を使用します。

このガイドで説明されているメソッドまたはタイプの詳細については、次のライブラリAPIドキュメントを参照してください。

startTransaction() メソッドの詳細については、拡張APIドキュメントのMongoDB\Driver\Session::startTransaction() を参照してください。