Overview
このガイドでは、一括書込み操作を使用して、1 つのデータベース呼び出しで複数の書込み操作を実行する方法を学習できます。
コレクションにドキュメントを挿入 し、複数の他のドキュメントを更新してから、ドキュメントを削除するシナリオを考えてみましょう。 個々のメソッドを使用する場合、各操作には独自のデータベース呼び出しが必要です。 代わりに、 一括操作を使用して、データベースへの呼び出し回数を減らすことができます。
サンプル データ
このガイドの例では、 Atlasサンプルデータセットのsample_restaurantsデータベースのrestaurantsコレクションを使用します。 PHPアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続するMongoDB\Clientをインスタンス化し、次の値を$collection変数に割り当てます。
$collection = $client->sample_restaurants->restaurants;
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、Atlas を使い始める を参照してください。
一括操作
一括書込み操作を実行するには、書込み操作の配列をMongoDB\Collection::bulkWrite()メソッドに渡します。 書込み操作を指定するには、次の構文を使用します。
[ [ 'deleteMany' => [ $filter ] ], [ 'deleteOne' => [ $filter ] ], [ 'insertOne' => [ $document ] ], [ 'replaceOne' => [ $filter, $replacement, $options ] ], [ 'updateMany' => [ $filter, $update, $options ] ], [ 'updateOne' => [ $filter, $update, $options ] ], ]
Tip
削除する、挿入、置換、および更新操作の詳細については、 CRUD操作 を参照してください。
bulkWrite() メソッドを呼び出すと、ライブラリは 配列で指定された順序で書込み操作を自動的に実行します。書き込み操作を任意の順序で実行するよう bulkWrite() に指示する方法については、一括書き込み動作の変更 を参照してください。
例
この例では、 restaurantsコレクションに対して次の書き込み操作を実行します。
挿入操作は、
name値が'Mongo's Deli'であるドキュメントを挿入しますname値が'Mongo's Deli'であるドキュメントのcuisineフィールドを更新する更新操作borough値が'Manhattan'であるすべてのドキュメントを削除する削除操作
$result = $collection->bulkWrite( [ [ 'insertOne' => [ ['name' => 'Mongo\'s Deli'], ['cuisine' => 'Sandwiches'], ['borough' => 'Manhattan'], ['restaurant_id' => '1234'], ], ], [ 'updateOne' => [ ['name' => 'Mongo\'s Deli'], ['$set' => ['cuisine' => 'Sandwiches and Salads']], ], ], [ 'deleteMany' => [ ['borough' => 'Manhattan'], ], ], ], );
一括書込み動作の変更
オプション値を指定する配列をパラメーターとして渡すことで、 MongoDB\Collection::bulkWrite()メソッドの動作を変更できます。 次の表では、 配列に設定できるオプションについて説明しています。
オプション | 説明 |
|---|---|
| 操作がドキュメントの検証をバイパスするかどうかを指定します。これにより、スキーマ検証要件を満たしていないドキュメントを修正できます(存在する場合)。スキーマ検証の詳細については、MongoDB Server マニュアルの「スキーマ検証」を参照してください。 |
| ドキュメントのエンコードまたはデコードに使用するコーデックを設定します。一括書き込みでは、 |
| 操作の書込み保証 (write concern)を設定します。 詳細については、 MongoDB Serverマニュアルの「 書込み保証 」を参照してください。 |
| 操作の読みやすさを向上させるために、 の値のリストを含むドキュメントを指定します。 値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。 詳細については、 MongoDB Serverマニュアルの let ステートメントを参照してください。 |
|
|
| 操作にコメントを付けます。 詳細については、 MongoDB Serverマニュアルの 「挿入コマンド フィールドのガイド」を参照してください。 |
| 操作に関連付けるクライアントセッションを指定します。 |
次の例では、 bulkWrite()メソッドを呼び出して挿入操作と削除操作を実行し、 orderedオプションをfalseに設定します。
$result = $collection->bulkWrite( [ [ 'insertOne' => [ ['name' => 'Mongo\'s Pizza'], ['cuisine' => 'Italian'], ['borough' => 'Queens'], ['restaurant_id' => '5678'], ], ], [ 'deleteOne' => [ ['restaurant_id' => '5678'], ], ], ], ['ordered' => false], );
ライブラリが最初に挿入操作を実行した場合、ドキュメントが 1 つ削除されます。 削除操作が最初に実行される場合、ドキュメントは削除されません。
注意
順序なしの一括操作では、実行順序は保証されません。 この順序は、ランタイムを最適化するために一覧表示する方法とは異なる場合があります。
戻り値
MongoDB\Collection::bulkWrite()メソッドはMongoDB\BulkWriteResultオブジェクトを返します。 このクラスには、次のメンバー関数が含まれています。
関数 | 説明 |
|---|---|
| 削除されたドキュメントの数を返します(存在する場合)。 |
| 挿入されたドキュメントの数を返します(存在する場合)。 |
| 挿入されたドキュメントの |
| 更新操作および置換操作中に一致したドキュメントの数を返します(該当する場合)。 |
| 変更されたドキュメントの数を返します(存在する場合)。 |
| アップサートされたドキュメントの数を返します(存在する場合)。 |
| アップサートされたドキュメントの |
| 一括操作が確認されたかどうかを示すブール値を返します。 |
詳細情報
個々の書込み操作を実行する方法については、次のガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。