Overview
このガイドでは、 Java Reactive Streams ドライバーを使用して更新操作を実行し、 MongoDBコレクション内のドキュメントを更新する方法を学習します。
更新操作は、 MongoDBコレクション内の 1 つ以上のドキュメントを更新します。 メソッドまたはupdateOne() updateMany()メソッドを使用して更新操作を実行できます。
サンプル データ
このガイドの例では、 Atlasサンプルデータセットのsample_restaurantsデータベースのrestaurantsコレクションを使用します。
無料のMongoDB Atlas cluster を作成し、サンプルデータセットをロードする方法については、 使い始めるチュートリアルを参照してください。
重要
プロジェクトリ アクター ライブラリ
このガイドでは、プロジェクト Reactive ライブラリを使用して、 Java Reactive Streams ドライバー メソッドによって返された Publisher インスタンスを消費します。Project Reactive ライブラリとその使用方法の詳細については、React ドキュメントの使用開始を参照してください。このガイドでは Project React ライブラリ メソッドをどのように使用しているかについて詳しくは、 「 MongoDBへのデータの書込み 」ガイドを参照してください。
アップデート操作
MongoDB では、次の方法で更新操作を実行できます。
updateOne()は、検索条件に一致する最初のドキュメントを更新します。updateMany()は、検索条件に一致するすべてのドキュメントを更新します
各更新方法には次のパラメーターが必要です。
クエリフィルタードキュメント。更新するドキュメントを決定します。 クエリフィルターの使用の詳細については、「フィルター」セクションを参照してください。
ドキュメントを更新し、更新演算子(実行する更新の種類)と変更するフィールドと値を指定します。 更新演算子の詳細については、「更新演算子 」セクションを参照してください。
フィルター
各アップデート メソッドにはクエリフィルターが必要です。このフィルターは、アップデート対象のドキュメントを選択するドキュメントを決定する検索条件を指定します。 フィルター オブジェクトの作成を容易にするために、ドライバーはフィルター条件ヘルパーメソッドを提供するFiltersクラスを提供します。
Filters ヘルパーのリストを表示するには、フィルターAPIドキュメント を参照してください。クエリフィルターの詳細については、 MongoDB Serverマニュアルの「 クエリフィルター ドキュメント 」セクションを参照してください。
更新演算子
ドキュメントのフィールドを変更するために、 MongoDBは 更新演算子 を提供します。 更新演算子を使用して実行する変更を指定するには、 更新ドキュメントを作成します。 アップデート ドキュメントの作成を容易にするために、ドライバーはフィルター条件ヘルパーメソッドを含むUpdatesヘルパークラスを提供します。
重要
_idフィールドは不変であるため、ドキュメント内の_idフィールドの値を変更することはできません。
更新演算子の詳細については、サーバー マニュアルの「更新演算子 」を参照してください。
1 つのドキュメントの更新
MongoDBコレクション内の単一のドキュメントを更新するには、updateOne() メソッドを呼び出し、クエリフィルターと更新演算子を渡します。次に、updateOne() の結果を Mono から静的 Mono.from() メソッドに渡します。 Mono は、プロジェクト Reactor ライブラリのクラスです。Java Reactive Streams では、ドライバー メソッドはコールド Publisher インスタンスを返します。つまり、返された Publisher をサブスクライブしないと、対応する操作は実行されません。このガイドでは、Project Reactor ライブラリを使用してそれらを消費します。Mono の詳細については、 Project React ドキュメントのMongoDBを参照してください。
次の例ではupdateOne()メソッドを使用して、一致するドキュメントのnameの値を"Bagels N Buns"から"2 Bagels 2 Buns"にアップデートします。
Publisher<UpdateResult> updatePublisher = restaurants.updateOne(eq("name", "Bagels N Buns"), set("name", "2 Bagels 2 Buns")); Mono.from(updatePublisher).block();
複数のドキュメントの更新
MongoDBコレクション内の複数のドキュメントを更新するには、updateMany() メソッドを呼び出し、クエリフィルターと更新演算子を渡します。次に、updateMany() の結果を Mono から静的 Mono.from() メソッドに渡します。 Mono は、プロジェクト Reactor ライブラリのクラスです。Java Reactive Streams では、ドライバー メソッドはコールド Publisher インスタンスを返します。つまり、返された Publisher をサブスクライブしないと、対応する操作は実行されません。このガイドでは、Project Reactor ライブラリを使用してそれらを消費します。Mono の詳細については、 Project React ドキュメントのMongoDBを参照してください。
次の例ではupdateMany()メソッドを使用して、 cuisineの値が"Pizza"のすべてのドキュメントを更新して、 cuisineの値が"Pasta"になります。
Publisher<UpdateResult> updatePublisher = restaurants.updateMany(eq("cuisine", "Pizza"), set("cuisine", "Pasta")); Mono.from(updatePublisher).block();
更新操作をカスタマイズする
UpdateOptionsクラスには、アップデート メソッドの動作を変更するメソッドが含まれています。 UpdateOptionsクラスを使用するには、クラスの新しいインスタンスを作成し、そのメソッドの 1 つ以上を呼び出して 更新操作を変更します。 これらのメソッド呼び出しを連鎖させることができます。 更新操作の動作を変更するには、クラスインスタンスと連鎖したメソッド呼び出しを メソッドまたは メソッドの 3updateOne() updateMany()つ目の引数として渡します。
更新操作を変更するには、 UpdateOptionsクラスの次の任意のメソッドを使用します。
方式 | 説明 |
|---|---|
| アップデートを適用する配列要素を指定します。 |
| アップデート操作がドキュメント検証をバイパスするかどうかを指定します。 これにより、スキーマ検証要件を満たさないドキュメントを更新することができます(存在する場合)。 スキーマ検証の詳細については、 マニュアルの「 スキーマ 検証MongoDB Server 」を参照してください。 |
| 結果をソートするときに使用する言語照合の種類を指定します。 詳細については、MongoDB Server マニュアルの 「照合」 を参照してください。 |
| 操作に |
| 操作に |
| 操作のインデックスを |
| 操作のインデックスを |
| パラメーター名と値のマップを指定します。 値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。 詳細については、 MongoDB Serverマニュアルの let ステートメントを参照してください。 |
| 操作に適用するソート基準を設定します。 |
| クエリフィルターに一致するドキュメントがない場合に、更新操作で アップサート 操作を実行するかどうかを指定します。 詳細については、 マニュアルの アップサート ステートメント MongoDB Serverを参照してください。 |
アップサートの例
upsert操作は、クエリフィルターに一致するドキュメントを更新し、クエリフィルターに一致するドキュメントがない場合は新しいドキュメントを挿入します。
次のコードでは、updateMany() メソッドを使用して、boroughフィールドの値が "Manhattan" であるすべてのドキュメントを検索します。次に、これらのドキュメントの borough の値を "Manhattan (north)" にアップデートします。 upsert オプションが true に設定されているため、クエリフィルターが既存のドキュメントと一致しない場合、 Java Reactive Streams ドライバーは新しいドキュメントを挿入します。この例では、クエリフィルターに一致するドキュメントの数と、 アップサート操作によって変更されたドキュメントの数が返されます。
Bson filter = Filters.eq("borough", "Manhattan"); Bson update = Updates.set("borough", "Manhattan (north)"); UpdateOptions options = new UpdateOptions().upsert(true); Publisher<UpdateResult> updateManyPublisher = restaurants.updateMany(filter, update, options); UpdateResult result = Mono.from(updateManyPublisher).block(); System.out.println("Matched: " + result.getMatchedCount() + ", Modified: " + result.getModifiedCount() + ", Upserted ID: " + result.getUpsertedId());
Matched: 10259, Modified: 10259, Upserted ID: null
戻り値
updateOne()メソッドとupdateMany()メソッドはそれぞれUpdateResultオブジェクトを返します。 UpdateResult型には次のインスタンスメソッドが含まれています。
方式 | 説明 |
|---|---|
| アップデートされた数に関係なく、クエリフィルターに一致したドキュメントの数。 |
| 更新操作によって変更されたドキュメントの数。 更新されたドキュメントが元と同一の場合、このカウントには含まれません。 |
| ドライバーがアップサートを実行した場合、データベースでアップサートされたドキュメントのID。 それ以外の場合は |
| 更新が確認された場合は true を返します。 |
詳細情報
更新演算子の詳細については、 MongoDB Serverマニュアルの「更新演算子 」を参照してください。
Java Reactive Streams ドライバーを使用してドキュメントを挿入する実行可能なコード例については、 CRUD操作ガイド を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。