Overview
このガイドでは、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( val id: Int, val color: String, val qty: Int, val prices: List<Double> )
更新操作の実行
次の方法を使用して、MongoDB 内のドキュメントを更新できます。
updateOne()は、検索条件に一致する最初のドキュメントを更新します。updateMany()は、検索条件に一致するすべてのドキュメントを更新します
各更新方法には次のパラメーターが必要です。
クエリフィルター。アップデートするドキュメントに一致する。 クエリフィルターの詳細については、「 クエリの指定」ガイドを参照してください。
更新ドキュメント。更新演算子または実行する更新の種類と、更新されるフィールドと値を指定します。更新演算子とその使用方法のリストについては、 MongoDBサーバーマニュアルの「フィールド更新演算子」を参照してください。
このガイドの例では、更新 ドキュメントを構築するためのヘルパーメソッドを提供するファクトリークラスである Updates ビルダを使用します。Updates ビルダの詳細については、更新ビルダガイド を参照してください。
1 つのドキュメントの更新
この例では、 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を乗算します