アップデート ビルダ
項目一覧
Overview
このガイドでは、MongoDB Kotlin ドライバーで ビルダ を使用して アップデート を指定する方法を学びます。
Updates
ビルダは、次のタイプのアップデートのヘルパー メソッドを提供します。
更新を期待するいくつかのメソッドは次のとおりです。
updateOne()
updateMany()
bulkWrite()
Updates
クラスは、すべての MongoDB 更新演算子の静的ファクトリー メソッドを提供します。 各メソッドはBSON型のインスタンスを返します。このインスタンスは、アップデート引数を必要とする任意のメソッドに渡すことができます。
Tip
簡潔にするために、 更新 のメソッドをインポートすることを選択できます。 クラス:
import com.mongodb.client.model.Updates.*
このガイドの例では、次のドキュメントを使用します。
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
この例は、特に指定がない限り、次のデータ クラスによってモデル化されます。
data class PaintOrder ( val id: Int, val color: String, val qty: Int?, val vendor: List<Vendor>?, val lastModified: LocalDateTime? ) data class Vendor ( val name: String, )
フィールドの更新
セット
set() を使用する メソッドを使用して、アップデート操作でフィールドの値を割り当てます。
次の例では、 qty
フィールドの値を11
に設定します。
val filter = Filters.eq("_id", 1) val update = Updates.set(PaintOrder::qty.name, 11) collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 11, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
設定解除
unset() を使用する アップデート操作でフィールドの値を削除するメソッド。
次の例では、 qty
フィールドを削除しています。
val filter = Filters.eq("_id", 1) val update = Updates.unset(PaintOrder::qty.name) collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
挿入時に設定
setOnInsert() を使用する メソッドを使用して、ドキュメントの挿入に対するアップデート操作でフィールドの値を割り当てます。
次の例では、操作によってドキュメントが挿入された場合に、 color
フィールドの値を"pink"
に設定します。
val filter = Filters.eq("_id", 1) val update = Updates.setOnInsert(PaintOrder::color.name, "pink") collection.updateOne(filter, update, UpdateOptions().upsert(true))
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "pink" }
注意
ドキュメントが挿入されていない場合は、変更は行われません。
増分
inc() を使用する メソッドを使用して、更新操作で数値フィールドの値を増加させます。
次の例では、 5
であったqty
フィールドの値を3
ずつ増加させます。
val filter = Filters.eq("_id", 1) val update = Updates.inc(PaintOrder::qty.name, 3) collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 8, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
乗算
multi() を使用する メソッドを使用して、更新操作で数値フィールドの値を乗算します。
次の例では、 5
であったqty
フィールドの値に2
を掛けます。
val filter = Filters.eq("_id", 1) val update = Updates.mul(PaintOrder::qty.name, 2) collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 10, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
rename
rename() を使用する メソッドを使用して、更新操作でフィールドの値の名前を変更します。
次の例では、 qty
フィールドの名前をquantity
に変更します。
val filter = Filters.eq("_id", 1) val update = Updates.rename(PaintOrder::qty.name, "quantity") collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" }, "quantity": 5, }
Min
min() の使用 メソッドを使用して、指定された値がフィールドの現在の値より小さい場合に、フィールドの値を指定された値に設定します。
次の例では、 2
がqty
フィールドの現在の値( 5
)より小さいため、 qty
フィールドを2
に更新します。
val filter = Filters.eq("_id", 1) val update = Updates.min(PaintOrder::qty.name, 2) collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 2, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Max
max() の使用 更新操作で指定された 2 つののうち大きい方の数を持つフィールドの値を更新します。
次の例では、 8
がqty
フィールドの現在の値( 5
)より大きいため、 qty
フィールドを8
に更新します。
val filter = Filters.eq("_id", 1) val update = Updates.max(PaintOrder::qty.name, 8) collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 8, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
現在の日付
currentDate() の使用 メソッドを使用して、更新操作内のフィールドの値を BSON 日付として現在の日付に割り当てます。
次の例では、 lastModified
フィールドの値を BSON 日付として現在の日付に設定します。
val filter = Filters.eq("_id", 1) val update = Updates.currentDate(PaintOrder::lastModified.name) collection.updateOne(filter, update)
このページは 2023 年 6 月 16 日に記述されているため、前の例では元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "$date": "2023-06-16T17:13:06.373Z" }
現在のタイムスタンプ
currentTimestamp() の メソッドを使用して、更新操作内のフィールドの値を タイムスタンプとして現在の日付に割り当てます。
次の例では、 lastModified
フィールドの値を BSON タイムスタンプとして現在の日付に設定します。
// Create a new instance of the collection with the flexible `Document` type // to allow for the changing of the `lastModified` field to a `BsonTimestamp` // from a `LocalDateTime`. val collection = database.getCollection<Document>("paint_orders") val filter = Filters.eq("_id", 1) val update = Updates.currentTimestamp(PaintOrder::lastModified.name) collection.updateOne(filter, update)
このページは 2023 年 6 月 16 日に記述されているため、前の例では元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "$timestamp": { "t": 1686935654, "i": 3 } }
ビット
ビットごとの Or() を使用する 、 bitWithAnd() 、 ビット Xor() メソッドを使用して、更新操作でフィールドの整数値のビット単位の更新を実行します。
次の例では、数値10
とqty
フィールドの整数値( 5
)の間でビット単位のOR
を実行します。
val filter = Filters.eq("_id", 1) val update = Updates.bitwiseOr(PaintOrder::qty.name, 10) collection.updateOne(filter, update)
ビット演算の結果は15
になります。
0101 // bit representation of 5 1010 // bit representation of 10 ---- 1111 // bit representation of 15
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 15, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Array Updates
セットに追加
addToSet() の使用 値がまだ更新操作に存在しない場合に、配列に値を追加するメソッド。
次の例では、 name
の値が"C"
であるVendor
インスタンスをvendor
配列に追加します。
val filter = Filters.eq("_id", 1) val update = Updates.addToSet(PaintOrder::vendor.name, Vendor("C")) collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" }, { "name": "C" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
ポップ
popFirst() を使用する メソッドを使用して、配列の最初の要素と opLast() アップデート操作で配列の最後の要素を削除するメソッド。
次の例えでは、 vendor
配列の 最初の エントリを削除します。
val filter = Filters.eq("_id", 1) val update = Updates.popFirst(PaintOrder::vendor.name) collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
すべてプル
PullAll() を使用する メソッドを使用して、アップデート操作において既存の配列から指定された値のすべてのインスタンスを削除します。
次の例では、 vendor
配列から"A"
と"M"
のname
値を持つVendor
インスタンスを削除します。
val filter = Filters.eq("_id", 1) val update = Updates.pullAll(PaintOrder::vendor.name, listOf(Vendor("A"), Vendor("M"))) collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "D" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
プル
Pull() を使用する メソッドを使用して、アップデート操作において既存の配列から指定された値のすべてのインスタンスを削除します。
次の例では、 vendor
配列からname
の値が"D"
であるVendor
インスタンスを削除します。
val filter = Filters.eq("_id", 1) val update = Updates.pull(PaintOrder::vendor.name, Vendor("D")) collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "A" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
プッシュ
push() を使用する メソッドを使用して、更新操作で配列に値を追加します。
次の例では、 name
の値が"Q"
であるVendor
インスタンスをvendor
配列に追加します。
val filter = Filters.eq("_id", 1) val update = Updates.push(PaintOrder::vendor.name, Vendor("Q")) collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" }, { "name": "Q" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
複数の更新演算子の組み合わせ
アプリケーションは、前のセクションで説明された更新演算子を 2 つ以上組み合わせて、単一のドキュメントの複数のフィールドを更新できます。
次の例では、 qty
フィールドの値を6
ずつ増加させ、 color
フィールドの値を"purple"
に設定し、 name
の値が"R"
であるVendor
インスタンスを に追加します。 vendor
フィールド:
val filter = Filters.eq("_id", 1) val update = Updates.combine( Updates.set(PaintOrder::color.name, "purple"), Updates.inc(PaintOrder::qty.name, 6), Updates.push(PaintOrder::vendor.name, Vendor("R")) ) collection.updateOne(filter, update)
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "purple", "qty": 11, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" }, { "name": "R" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }