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()は、検索条件に一致するすべてのドキュメントを更新します
各更新方法には次のパラメーターが必要です。
Query filter document, which determines the documents to update. For more information about using query filters, see the Filters section.
Update document, which specifies the update operator (the kind of update to perform) and the fields and values to change. For more information about update operators, see the Update Operators section.
フィルター
各アップデート メソッドにはクエリフィルターが必要です。このフィルターは、アップデート対象のドキュメントを選択するドキュメントを決定する検索条件を指定します。 フィルター オブジェクトの作成を容易にするために、ドライバーはフィルター条件ヘルパーメソッドを提供する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クラスの次の任意のメソッドを使用します。
方式 | 説明 |
|---|---|
| アップデートを適用する配列要素を指定します。 |
| Specifies whether the update operation bypasses document validation. This lets you update documents that don't meet the schema validation requirements, if any exist. For more information about schema validation, see Schema Validation in the MongoDB Server manual. |
| Specifies the kind of language collation to use when sorting results. For more information, see Collation in the MongoDB Server manual. |
| Attaches a |
| Attaches a |
| Sets the index for the operation as a |
| Sets the index for the operation as a |
| Specifies a map of parameter names and values. Values must be constant or closed expressions that don't reference document fields. For more information, see the let statement in the MongoDB Server manual. |
| 操作に適用するソート基準を設定します。 |
| Specifies whether the update operation performs an upsert operation if no documents match the query filter. For more information, see the upsert statement in the MongoDB Server manual. |
アップサートの例
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());
戻り値
updateOne()メソッドとupdateMany()メソッドはそれぞれUpdateResultオブジェクトを返します。 UpdateResult型には次のインスタンスメソッドが含まれています。
方式 | 説明 |
|---|---|
| アップデートされた数に関係なく、クエリフィルターに一致したドキュメントの数。 |
| 更新操作によって変更されたドキュメントの数。 更新されたドキュメントが元と同一の場合、このカウントには含まれません。 |
| ドライバーがアップサートを実行した場合、データベースでアップサートされたドキュメントのID。 それ以外の場合は |
| 更新が確認された場合は true を返します。 |
詳細情報
For additional information about update operators, see Update Operators in the MongoDB Server manual.
Java Reactive Streams ドライバーを使用してドキュメントを挿入する実行可能なコード例については、「CRUD 操作」ガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。