AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

Update Documents

このガイドでは、 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()は、検索条件に一致するすべてのドキュメントを更新します

各更新方法には次のパラメーターが必要です。

  • クエリフィルター。アップデートするドキュメントに一致します。クエリフィルターの詳細については、「 クエリの指定 」ガイドを参照してください。

  • ドキュメント を更新し、更新演算子と更新するフィールドと値を指定します。更新演算子は、実行する更新のタイプを指定します。 更新演算子のリストを表示し、その使用方法については、 MongoDB Serverマニュアルの「 フィールド更新演算子 」のガイドページを参照してください。

次の例では、 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 メソッドについて説明します。

方式
説明

upsert()

クエリフィルターに一致するドキュメントがない場合は、更新操作でアップサート操作を実行するかどうかを指定します。詳細については、 MongoDB Serverマニュアルの アップサート ステートメント を参照してください。デフォルトは
false

sort()

操作に適用するソート基準を設定します。 updateOne() メソッドに渡すクエリフィルターに複数のドキュメントが一致する場合、この操作最初の結果が更新されます。 このオプションを に設定すると、一致したドキュメントに順序を適用し、更新されるドキュメントをより詳細に制御できます。

bypassDocumentValidation()

アップデート操作がドキュメント検証をバイパスするかどうかを指定します。これにより、スキーマ検証要件を満たさないドキュメントを更新することができます(存在する場合)。スキーマ検証の詳細については、 MongoDB Serverマニュアルの「 スキーマバリデーション 」を参照してください。デフォルトは
falseです。

collation()

結果をソートするときに使用する言語照合の種類を指定します。 詳細については、MongoDB Server マニュアルの 「照合」 を参照してください。

arrayFilters()

アップデートを適用する配列要素を選択するために指定するフィルターのリストを提供します。

hint()

ドキュメントをマッチングするときに使用するインデックスを設定します。 詳細については、 MongoDB Serverマニュアルの ヒント ステートメントを参照してください。

let()

操作の最上位変数を設定するためのパラメーター名と値のマップを提供します。 値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。 詳細については、 MongoDB Serverマニュアルの let ステートメントを参照してください。

comment()

操作に添付するコメントを設定します。 詳細については、 MongoDB Serverマニュアルの 「更新コマンド フィールドのガイド」を参照してください。

この例では、オプションを作成し、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インスタンスからの情報にアクセスするには、次のメソッドを使用できます。

方式
説明

getMatchedCount()

アップデートが実行された回数に関係なく、クエリフィルターに一致したドキュメントの数を返します。

getModifiedCount()

更新操作によって変更されたドキュメントの数を返します。 更新されたドキュメントが元と同一の場合、このカウントには含まれません。

wasAcknowledged()

サーバーが結果を確認した場合は true を返します。

getUpsertedId()

ドライバーがアップサートを実行した場合、データベースでアップサートされたドキュメントの _id 値を返します。

注意

wasAcknowledged()メソッドがfalseを返す場合、 UpdateResultインスタンスから他の情報にアクセスしようとすると、 InvalidOperation例外が発生します。 サーバーが書込み (write) 操作を確認しない場合、ドライバーはこれらの値を決定できません。

Scalaドライバーを使用してドキュメントを更新する方法を示す実行可能なコード例については、 「 MongoDBへのデータの書込み 」を参照してください。

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。