Overview
このガイドでは、 Scalaドライバーを使用して updateOne() メソッドと updateMany() メソッドを使用してMongoDBコレクション内のドキュメントを更新する方法を学習できます。
サンプル データ
restaurantssample_restaurantsこのガイドの例では、Atlasサンプルデータセット の データベースの コレクションを使用します。Scalaアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続する MongoClient を作成し、database 変数と collection 変数に次の値を割り当てます。
val database: MongoDatabase = mongoClient.getDatabase("sample_restaurants") val collection: MongoCollection[Document] = database.getCollection("restaurants")
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、MongoDBを使い始めるガイドを参照してください。
アップデート操作
次の方法を使用して、MongoDB 内のドキュメントを更新できます。
updateOne()は、検索条件に一致する最初のドキュメントを更新します。updateMany()は、検索条件に一致するすべてのドキュメントを更新します
各更新方法には次のパラメーターが必要です。
1 つのドキュメントの更新例
次の例では、 updateOne() メソッドを使用して、ドキュメントの nameフィールドの値を "Happy Garden" から "Mountain House" に更新します。 アップデートドキュメントでは、 set() メソッドを使用して nameフィールド値をアップデートします。
val filter = equal("name", "Happy Garden") val update = set("name", "Mountain House") val observable: Observable[UpdateResult] = collection.updateOne(filter, update) observable.subscribe(new Observer[UpdateResult] { override def onNext(result: UpdateResult): Unit = println(s"Updated document count: ${result.getModifiedCount}") override def onError(e: Throwable): Unit = println(s"Failed: ${e.getMessage}") override def onComplete(): Unit = println("Completed") })
Updated document count: 1 Completed
多数のドキュメントの更新例
次の例では、 updateMany() メソッドを使用して、nameフィールド値が "Starbucks" であるすべてのドキュメントを更新します。 アップデートドキュメントでは、 rename() メソッドを使用して、addressフィールドの名前を location に変更します。
val filter = equal("name", "Starbucks") val update = rename("address", "location") val observable: Observable[UpdateResult] = collection.updateMany(filter, update) observable.subscribe(new Observer[UpdateResult] { override def onNext(result: UpdateResult): Unit = println(s"Updated document count: ${result.getModifiedCount}") override def onError(e: Throwable): Unit = println(s"Failed: ${e.getMessage}") override def onComplete(): Unit = println("Completed") })
Updated document count: 11 Completed
更新操作をカスタマイズする
updateOne()メソッドとupdateMany()メソッドは、更新操作を構成するためのオプションを設定する パラメーターをオプションで受け入れます。 オプションを指定しない場合、ドライバーはデフォルト設定で更新操作を実行します。
次の表では、 UpdateOptionsインスタンスを構成するために使用できる setter メソッドについて説明します。
方式 | 説明 |
|---|---|
| クエリフィルターに一致するドキュメントがない場合は、更新操作でアップサート操作を実行するかどうかを指定します。詳細については、 MongoDB Serverマニュアルの アップサート ステートメント を参照してください。デフォルトは |
| 操作に適用するソート基準を設定します。 |
| アップデート操作がドキュメント検証をバイパスするかどうかを指定します。これにより、スキーマ検証要件を満たさないドキュメントを更新することができます(存在する場合)。スキーマ検証の詳細については、 MongoDB Serverマニュアルの「 スキーマバリデーション 」を参照してください。デフォルトは |
| 結果をソートするときに使用する言語照合の種類を指定します。 詳細については、MongoDB Server マニュアルの 「照合」 を参照してください。 |
| アップデートを適用する配列要素を選択するために指定するフィルターのリストを提供します。 |
| ドキュメントをマッチングするときに使用するインデックスを設定します。 詳細については、 MongoDB Serverマニュアルの ヒント ステートメントを参照してください。 |
| 操作の最上位変数を設定するためのパラメーター名と値のマップを提供します。 値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。 詳細については、 MongoDB Serverマニュアルの let ステートメントを参照してください。 |
|
変更更新の例
この例では、オプションを作成し、updateOne() メソッドに渡します。 この例では、 equal()ヘルパーメソッドを使用して、nameフィールドの値が "Sunrise Pizzeria" であるドキュメントを一致させます。 次に、set() メソッドを使用して、最初に一致するドキュメントの boroughフィールド値を "Queens" に設定し、cuisineフィールド値を "Italian" に設定します。 このコードでは、 combine() メソッドを使用して、1 つの更新ドキュメントで複数の更新を指定します。
UpdateOptionsインスタンスでは upsert オプションは true に設定されているため、クエリフィルターが既存のドキュメントと一致しない場合、フィルターとアップデートドキュメントで指定されたフィールドと値を持つ新しいドキュメントをドライバーは挿入します。
val filter = equal("name", "Sunrise Pizzeria") val opts = UpdateOptions().upsert(true) val update = combine( set("borough", "Queens"), set("cuisine", "Italian") ) val observable: Observable[UpdateResult] = collection.updateOne(filter, update, opts) observable.subscribe(new Observer[UpdateResult] { override def onNext(result: UpdateResult): Unit = println(s"Updated document count: ${result.getModifiedCount}") override def onError(e: Throwable): Unit = println(s"Failed: ${e.getMessage}") override def onComplete(): Unit = println("Completed") })
Updated document count: 1 Completed
戻り値
updateOne()メソッドとupdateMany()メソッドはそれぞれUpdateResultオブジェクトを返します。 UpdateResultインスタンスからの情報にアクセスするには、次のメソッドを使用できます。
方式 | 説明 |
|---|---|
| アップデートが実行された回数に関係なく、クエリフィルターに一致したドキュメントの数を返します。 |
| 更新操作によって変更されたドキュメントの数を返します。 更新されたドキュメントが元と同一の場合、このカウントには含まれません。 |
| サーバーが結果を確認した場合は |
| ドライバーがアップサートを実行した場合、データベースでアップサートされたドキュメントの |
注意
wasAcknowledged()メソッドがfalseを返す場合、 UpdateResultインスタンスから他の情報にアクセスしようとすると、 InvalidOperation例外が発生します。 サーバーが書込み (write) 操作を確認しない場合、ドライバーはこれらの値を決定できません。
詳細情報
Scalaドライバーを使用してドキュメントを更新する方法を示す実行可能なコード例については、 「 MongoDBへのデータの書込み 」を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。