Docs Menu
Docs Home
/ /

Update Documents

このガイドでは、updateOne() メソッドと updateMany() メソッドを使用してMongoDBコレクション内のドキュメントを更新する方法を学びます。

このガイドの例では、店舗の在庫に塗料を表すドキュメントを保存する paint_inventoryコレクションに対して操作を実行しています。このコレクションには、次のサンプルドキュメントが含まれています。

{ "_id": 1, "color": "red", "qty": 5, "prices": [15.99, 19.99] }
{ "_id": 2, "color": "purple", "qty": 8, "prices": [18.99, 22.99] }
{ "_id": 3, "color": "yellow", "qty": 0, "prices": [14.99, 17.99] }
{ "_id": 4, "color": "green", "qty": 6, "prices": [19.99, 24.99] }
{ "_id": 5, "color": "blue", "qty": 3, "prices": [17.99, 21.99] }

次のKotlinデータクラスは、コレクションのドキュメントをモデル化します。

data class PaintOrder(
@BsonId val id: Int,
val color: String,
val qty: Int,
val prices: List<Double>
)

次の方法を使用して、MongoDB 内のドキュメントを更新できます。

  • updateOne()は、検索条件に一致する最初のドキュメントを更新します。

  • updateMany()は、検索条件に一致するすべてのドキュメントを更新します

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

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

  • 更新ドキュメント。更新演算子または実行する更新の種類と、更新されるフィールドと値を指定します。更新演算子とその使用方法のリストについては、 MongoDBサーバーマニュアルの「フィールド更新演算子」を参照してください。

このガイドの例では、更新 ドキュメントを構築するためのヘルパーメソッドを提供するファクトリークラスである Updates ビルダを使用します。Updates ビルダの詳細については、更新ビルダガイド を参照してください。

この例では、 updateOne()メソッドを使用して次のアクションを実行しています。

  • colorフィールド値が "yellow" であるドキュメントに一致します

  • Updates ビルダを使用して、一致するドキュメントの qtyフィールド値を 1 ずつ増加させます

val filter = Filters.eq(PaintOrder::color.name, "yellow")
val update = Updates.inc(PaintOrder::qty.name, 1)
val result = collection.updateOne(filter, update)
println("Matched document count: ${result.matchedCount}")
println("Modified document count: ${result.modifiedCount}")
Matched document count: 1
Modified document count: 1

注意

updateOne() メソッドに渡されたクエリフィルターに一致するドキュメントが複数ある場合、この操作最初の結果のみが更新されます。操作が一致するドキュメントを制御するには、ソート順序を指定できます。sort オプションの詳細については、結果の並べ替え ページを参照してください。

次の例では、 updateMany()メソッドを使用して次のアクションが実行されています。

  • 空のクエリフィルターを使用してすべてのドキュメントを一致させます

  • Updatesビルダーを使用して、一致するすべてのドキュメントの qtyフィールド値を 20 ずつ増加させます

val filterMany = Filters.empty()
val updateMany = Updates.inc(PaintOrder::qty.name, 20)
val resultMany = collection.updateMany(filterMany, updateMany)
println("Matched document count: ${resultMany.matchedCount}")
println("Modified document count: ${resultMany.modifiedCount}")
Matched document count: 5
Modified document count: 5

更新操作後、paint_inventoryコレクション内のドキュメントには次の値が含まれます。

{ "_id": 1, "color": "red", "qty": 25, "prices": [15.99, 19.99] }
{ "_id": 2, "color": "purple", "qty": 28, "prices": [18.99, 22.99] }
{ "_id": 3, "color": "yellow", "qty": 20, "prices": [14.99, 17.99] }
{ "_id": 4, "color": "green", "qty": 26, "prices": [19.99, 24.99] }
{ "_id": 5, "color": "blue", "qty": 23, "prices": [17.99, 21.99] }

注意

クエリフィルターがどのドキュメントにも一致しない場合、updateMany() メソッドはコレクション内のドキュメントに変更を加えません。一致するドキュメントがない場合は、upsert オプションを使用して新しいドキュメントを挿入できます。このオプションを使用する例については、「1 回の操作で挿入または更新」を参照してください。

重要

updateOne() メソッドと updateMany() メソッドでは、コレクションのユニークインデックス制約 に違反するドキュメントを変更できません。詳細については、 MongoDBサーバーマニュアルの 「ユニークインデックス」 を参照してください。

ドキュメントの配列値を更新するには、Updates ビルダを使用して実行する更新と更新する配列要素を指定します。次に、updateOne() メソッドまたは updateMany() メソッドを呼び出して 更新操作を実行します。

次の位置演算子を使用して、アップデートする配列要素を指定できます。

  • $:クエリフィルターに一致する最初の配列要素を更新します。

  • $[]: 配列内のすべての要素を更新します。

  • $[<identifier>]: フィルターに一致する配列要素を更新します。

このセクションの例は、各位置演算子の使用方法を示します。

クエリフィルターに一致する最初の配列要素を更新するには、位置演算子($)演算子を使用し、クエリフィルターで更新する配列フィールドを指定します。

この例では、次のアクションを実行します。

  • 15.99 を含む prices 配列があるドキュメントに一致します

  • $ の位置演算子を使用して、一致するドキュメントの prices 配列の最初の値を 2 増やします

val filterArrayFirst = Filters.eq(PaintOrder::prices.name, 15.99)
val updateArrayFirst = Updates.inc("${PaintOrder::prices.name}.$", 2)
val resultArrayFirst = collection.updateOne(filterArrayFirst, updateArrayFirst)
println("Modified document count: ${resultArrayFirst.modifiedCount}")
Modified document count: 1

配列内のすべての要素を更新するには、すべての位置($[])演算子を使用します。

この例では、次のアクションを実行します。

  • color 値が "green" であるドキュメントに一致します

  • $[]位置演算子を使用して、一致するドキュメントのprices配列内のすべての値に1.1を乗算します

戻る

クエリ テキスト

項目一覧