Update Documents
Overview
このガイドでは、 Java Reactive Streams ドライバーを使用して更新操作を実行し、 MongoDBコレクション内のドキュメントを更新する方法を学習します。
更新操作は、 MongoDBコレクション内の 1 つ以上のドキュメントを更新します。 updateOne()
またはupdateMany()
メソッドを使用して更新操作を実行できます。
サンプル データ
このガイドの例では、 Atlasサンプルデータセットのsample_restaurants
データベースのrestaurants
コレクションを使用します。
無料のMongoDB Atlasクラスターを作成し、サンプルデータセットをロードする方法については、「 を使い始める 」チュートリアルを参照してください。
重要
プロジェクトリ アクター ライブラリ
このガイドでは、プロジェクト Reactive ライブラリを使用して、Publisher
Java Reactive Streams ドライバー メソッドによって返された インスタンスを消費します。プロジェクト Reactor ライブラリとその使用方法の詳細については、React ドキュメントの「 使用開始 」 を参照してください。このガイドでは Project React ライブラリ メソッドをどのように使用しているかについて詳しくは、「 MongoDBへのデータの書込み 」ガイドを参照してください。
アップデート操作
MongoDB では、次の方法で更新操作を実行できます。
updateOne()
は、検索条件に一致する最初のドキュメントを更新します。updateMany()
は、検索条件に一致するすべてのドキュメントを更新します
各更新方法には次のパラメーターが必要です。
クエリフィルタードキュメント。更新するドキュメントを決定します。 クエリフィルターの使用の詳細については、「フィルター」セクションを参照してください。
ドキュメントを更新し、更新演算子(実行する更新の種類)と変更するフィールドと値を指定します。 更新演算子の詳細については、「更新演算子 」セクションを参照してください。
フィルター
各アップデート メソッドにはクエリフィルターが必要です。このフィルターは、アップデート対象のドキュメントを選択するドキュメントを決定する検索条件を指定します。 フィルター オブジェクトの作成を容易にするために、ドライバーはフィルター条件ヘルパーメソッドを提供するFilters
クラスを提供します。
ヘルパーのリストを表示するには、 フィルターAPIドキュメントFilters
を参照してください 。クエリフィルターの詳細については、 MongoDB Serverマニュアルの「クエリフィルター ドキュメント 」セクションを参照してください。
更新演算子
ドキュメントのフィールドを変更するために、 MongoDBは 更新演算子 を提供します。 更新演算子を使用して実行する変更を指定するには、 更新ドキュメントを作成します。 アップデート ドキュメントの作成を容易にするために、ドライバーはフィルター条件ヘルパーメソッドを含むUpdates
ヘルパークラスを提供します。
重要
_id
フィールドは不変であるため、ドキュメント内の_id
フィールドの値を変更することはできません。
更新演算子の詳細については、サーバー マニュアルの「更新演算子 」を参照してください。
1 つのドキュメントの更新
MongoDBコレクション内の単一のドキュメントを更新するには、 updateOne()
メソッドを呼び出し、クエリフィルターと更新演算子を渡します。 次に、 updateOne()
の結果をMono
から静的Mono.from()
メソッドに渡します。 Mono
は、プロジェクト Reactor ライブラリのクラスです。 Java Reactive Streams では、ドライバー メソッドはコールドPublisher
インスタンスを返します。つまり、返されたPublisher
をサブスクライブしないと、対応する操作は実行されません。 このガイドでは、Project Reactor ライブラリを使用してそれらを消費します。 Mono
の詳細については、 MongoDB を参照してください プロジェクト React のドキュメントを参照してください。
次の例では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
の詳細については、 MongoDB を参照してください プロジェクト React のドキュメントを参照してください。
次の例では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
クラスの次の任意のメソッドを使用します。
方式 | 説明 |
---|---|
arrayFilters(List<? extends Bson> arrayFilters) | Specifies which array elements an update applies
to. |
bypassDocumentValidation(Boolean bypassDocumentValidation) | 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. |
collation(Collation collation) | Specifies the kind of language collation to use when sorting
results. For more information, see Collation
in the MongoDB Server manual. |
comment(Bson comment) | Attaches a Bson comment to the operation. For more information, see the insert command
fields guide in the
MongoDB Server manual. |
comment(String comment) | Attaches a String comment to the operation. For more information, see the insert command
fields guide in the
MongoDB Server manual. |
hint(Bson hint) | Sets the index for the operation as a Bson value.
For more information, see the hint statement
in the MongoDB Server manual. |
hint(String hint) | Sets the index for the operation as a String value.
For more information, see the hint statement
in the MongoDB Server manual. |
let(Bson variables) | 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. |
upsert(Boolean upsert) | 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. |
例
次のコードでは、 updateMany()
メソッドを使用して、 borough
フィールドの値が"Manhattan"
であるすべてのドキュメントを検索します。 次に、これらのドキュメントのborough
値を"Manhattan (north)"
にアップデートします。 upsert
オプションがtrue
に設定されているため、クエリフィルターが既存のドキュメントと一致しない場合、 Java Reactive Streams ドライバーは新しいドキュメントを挿入します。
Publisher<UpdateResult> updatePublisher = restaurants.updateMany( eq("borough", "Manhattan"), set("borough", "Manhattan (north)"), new UpdateOptions().upsert(true)); Mono.from(updatePublisher).block();
戻り値
updateOne()
メソッドとupdateMany()
メソッドはそれぞれUpdateResult
オブジェクトを返します。 UpdateResult
型には次のインスタンスメソッドが含まれています。
方式 | 説明 |
---|---|
getMatchedCount() | The number of documents that matched the query filter, regardless of
how many were updated. |
getModifiedCount() | The number of documents modified by the update operation. If an updated
document is identical to the original, it is not included in this
count. |
getUpsertedId() | The ID of the document that was upserted in the database, if the driver
performed an upsert. Otherwise null . |
wasAcknowledged() | Returns true if the update was acknowledged. |
詳細情報
更新演算子の詳細については、 MongoDB Serverマニュアルの「更新演算子 」を参照してください。
Java Reactive Streams ドライバーを使用してドキュメントを挿入する実行可能なコード例については、 「 MongoDBへのデータの書込み」ガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。