Overview
このガイドでは、 MongoDB PHPライブラリを使用してMongoDBコレクション内のドキュメントを更新する方法を学習できます。 単一のドキュメントを更新するにはMongoDB\Collection::updateOne()メソッドを、複数のドキュメントを更新するにはMongoDB\Collection::updateMany()メソッドを呼び出します。
サンプル データ
このガイドの例では、 Atlasサンプルデータセットのsample_restaurantsデータベースのrestaurantsコレクションを使用します。 PHPアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続するMongoDB\Clientをインスタンス化し、次の値を$collection変数に割り当てます。
$collection = $client->sample_restaurants->restaurants;
MongoDB配置を作成し、サンプルデータセットをロードする方法については、MongoDBの使用開始ガイドを参照してください。
アップデート操作
MongoDB では、次の方法で更新操作を実行できます。
MongoDB\Collection::updateOne()は、検索条件に一致する最初のドキュメントを更新します。MongoDB\Collection::updateMany()は、検索条件に一致するすべてのドキュメントを更新します
各更新方法には次のパラメーターが必要です。
クエリフィルタードキュメント: 更新するドキュメントを指定します。 クエリフィルターの詳細については、 MongoDB Serverマニュアルの「クエリフィルター ドキュメント 」セクションを参照してください。
ドキュメントの更新:更新演算子、または実行する更新の種類と、変更するフィールドと値を指定します。 更新演算子とその使用方法のリストについては、 MongoDB Serverマニュアルの「フィールド更新演算子 」のガイドを参照してください。
1 つのドキュメントの更新
次の例では、 updateOne()メソッドを使用して、 restaurantsコレクション内のドキュメントのname値を'Bagels N Buns'から'2 Bagels 2 Buns'に更新します。
$result = $collection->updateOne( ['name' => 'Bagels N Buns'], ['$set' => ['name' => '2 Bagels 2 Buns']], );
多くのドキュメントの更新
次の例では、 updateMany()メソッドを使用して、 cuisineの値が'Pizza'であるすべてのドキュメントを更新します。 更新後、ドキュメントのcuisine値は'Pasta'になります。
$result = $collection->updateMany( ['cuisine' => 'Pizza'], ['$set' => ['cuisine' => 'Pasta']], );
更新操作をカスタマイズする
オプション値を指定する配列をパラメーターとして渡すことで、 updateOne()メソッドとupdateMany()メソッドの動作を変更できます。 次の表では、 配列に設定できるオプションの一部を説明しています。
オプション | 説明 |
|---|---|
| クエリフィルターに一致するドキュメントがない場合は、更新操作でアップサート操作を実行するかどうかを指定します。詳細については、 MongoDB Serverマニュアルの アップサート ステートメント を参照してください。デフォルトは |
| アップデート操作がドキュメント検証をバイパスするかどうかを指定します。これにより、スキーマ検証要件を満たさないドキュメントを更新することができます(存在する場合)。スキーマ検証の詳細については、 MongoDB Serverマニュアルの「 スキーマバリデーション 」を参照してください。デフォルトは |
|
|
| |
| 操作で配列フィールドが変更される場合に、アップデートを適用する配列要素を指定します。 |
| ドキュメントをスキャンするインデックスを設定します。 詳細については、 MongoDB Serverマニュアルの ヒント ステートメントを参照してください。 |
| 操作の書込み保証 (write concern)を設定します。 詳細については、 MongoDB Serverマニュアルの「 書込み保証 」を参照してください。 |
| 操作の読みやすさを向上させるために、 の値のリストを含むドキュメントを指定します。 値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。 詳細については、 MongoDB Serverマニュアルの let ステートメントを参照してください。 |
| 操作に添付するコメント。 詳細については、MongoDB Server マニュアルの 「挿入コマンド フィールドのガイド」 を参照してください。 |
次の例では、 updateMany()メソッドを使用して、 boroughの値が'Manhattan'であるすべてのドキュメントを検索します。 次に、これらのドキュメントのborough値を'Manhattan (north)'にアップデートします。 upsertオプションがtrueに設定されているため、クエリフィルターが既存のドキュメントと一致しない場合、 MongoDB PHPライブラリは新しいドキュメントを挿入します。
$result = $collection->updateMany( ['borough' => 'Manhattan'], ['$set' => ['borough' => 'Manhattan (north)']], ['upsert' => true], );
照合
操作の 照合 を指定するには、collation オプションを設定する $options 配列パラメータを操作メソッドに渡します。照合ルールを構成する配列に collation オプションを割り当てます。
次の表では、照合を構成するために設定できるフィールドについて説明しています。
フィールド | 説明 |
|---|---|
| (必須)Unicode 用の国際コンポーネント(ICU)ロケールを指定します。サポートされているロケールのリストについては、 MongoDB Serverマニュアルの 「照合ロケールとデフォルト パラメーター」 |
| (任意)大文字と小文字の比較を含めるかどうかを指定します。 |
|
|
| (任意) ICU |
| (任意)ドライバーが数字の string を数値として比較するかどうかを指定します。 |
|
|
| (任意) |
| (任意)発音区別符号を含む string を、string |
照合と各フィールドに可能な値の詳細については、 MongoDB Serverマニュアルの「 照合 」エントリを参照してください。
戻り値
updateOne()メソッドとupdateMany()メソッドはMongoDB\UpdateResultクラスのインスタンスを返します。 このクラスには、次のメンバー関数が含まれています。
関数 | 説明 |
|---|---|
| アップデートされた数に関係なく、クエリフィルターに一致したドキュメントの数を返します。 |
| 更新操作によって変更されたドキュメントの数を返します。 更新されたドキュメントが元と同一の場合、このカウントには含まれません。 |
| サーバーが書込み (write)操作を確認したかどうかを示すブール値を返します。 |
| データベースにアップサートされたドキュメントの数を返します。 |
| ドライバーがアップサートを実行した場合、データベースでアップサートされたドキュメントのIDを返します。 |
次の例では、 updateMany()メソッドを使用して、一致するドキュメントのnameフィールドを'Dunkin' Donuts'から'Dunkin''にアップデートします。 変更されたドキュメントの数を出力するには、 getModifiedCount()メンバー関数を呼び出します。
$result = $collection->updateMany( ['name' => 'Dunkin\' Donuts'], ['$set' => ['name' => 'Dunkin\'']], ); echo 'Modified documents: ', $result->getModifiedCount();
Modified documents: 206
更新 Builder
MongoDB\Builder\Updateクラスを使用すると、IDE コード完了とPHPタイプ チェックをサポートして更新ドキュメントを作成できます。Updateクラスは、$set、$inc、$unset などのMongoDB更新演算子に対応するファクトリー メソッドを提供します。
更新 ビルダを使用するには、次の クラスをアプリケーションにインポートします 。
use MongoDB\Builder\Query; use MongoDB\Builder\Update;
次の例ではUpdate::set() ファクトリー メソッドを使用して、restaurantsコレクション内の name 値が 'Bagels N Buns' である最初の一致するドキュメントの nameフィールドを '2 Bagels 2 Buns' に更新します。
$result = $collection->updateOne( Query::query(name: Query::eq('Bagels N Buns')), Update::set(name: '2 Bagels 2 Buns'), );
1 つの操作で複数の更新演算子を適用するには、演算子を MongoDB\Builder\Update コンストラクターに渡します。次の例では、Update::set() と Update::unset() を組み合わせて、cuisineフィールドをPasta に設定し、cuisine 値が 'Pizza' であるすべてのドキュメントから gradesフィールドを削除します。
$result = $collection->updateMany( Query::query(cuisine: Query::eq('Pizza')), new Update( Update::set(cuisine: 'Pasta'), Update::unset('grades'), ), );
ビルダ クラスの詳細とその他の例については、ビルダを使用した操作 ガイドを参照してください。
詳細情報
クエリフィルターの作成の詳細については、「クエリの指定」ガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。