AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

一括書き込み操作

このガイドでは、一括書込み操作を使用して、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()メソッドの動作を変更できます。 次の表では、 配列に設定できるオプションについて説明しています。

オプション
説明

bypassDocumentValidation

操作がドキュメントの検証をバイパスするかどうかを指定します。これにより、スキーマ検証要件を満たしていないドキュメントを修正できます(存在する場合)。スキーマ検証の詳細については、MongoDB Server マニュアルの「スキーマ検証」を参照してください。
デフォルト値は false です。

codec

ドキュメントのエンコードまたはデコードに使用するコーデックを設定します。一括書き込みでは、 insertOne()操作とreplaceOne()操作に コーデックを使用します。詳細については、タイプ コーデックによるデータのエンコードを参照してください。

writeConcern

操作の書込み保証 (write concern)を設定します。 詳細については、 MongoDB Serverマニュアルの「 書込み保証 」を参照してください。

let

操作の読みやすさを向上させるために、 の値のリストを含むドキュメントを指定します。 値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。 詳細については、 MongoDB Serverマニュアルの let ステートメントを参照してください。

ordered

true に設定されている場合: 1 回の書き込み (write) が失敗すると、残りの書き込み (write) を実行せずに操作が停止し、例外がスローされます。
falseに設定されている場合: 1 つの書き込み (write) が失敗すると、操作は残りの書き込み (write) 操作を引き続き試行し、存在する場合は例外をスローします。
デフォルトは true です。

comment

操作にコメントを付けます。 詳細については、 MongoDB Serverマニュアルの 「挿入コマンド フィールドのガイド」を参照してください。

session

操作に関連付けるクライアントセッションを指定します。

次の例では、 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オブジェクトを返します。 このクラスには、次のメンバー関数が含まれています。

関数
説明

getDeletedCount()

削除されたドキュメントの数を返します(存在する場合)。

getInsertedCount()

挿入されたドキュメントの数を返します(存在する場合)。

getInsertedIds()

挿入されたドキュメントの _idフィールド値のマップを返します(存在する場合)。

getMatchedCount()

更新操作および置換操作中に一致したドキュメントの数を返します(該当する場合)。

getModifiedCount()

変更されたドキュメントの数を返します(存在する場合)。

getUpsertedCount()

アップサートされたドキュメントの数を返します(存在する場合)。

getUpsertedIds()

アップサートされたドキュメントの _idフィールド値のマップを返します(存在する場合)。

isAcknowledged()

一括操作が確認されたかどうかを示すブール値を返します。

個々の書込み操作を実行する方法については、次のガイドを参照してください。

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。