Overview
このガイドでは、MongoDB Kotlin ドライバーを使用してドキュメント内の配列をアップデートする方法を学習できます。
配列を更新するには、次の操作を行う必要があります。
実行する更新を指定する
アップデートを適用する配列要素を指定する
これらの仕様を使用して更新操作を実行します
サンプルドキュメント
次のセクションでは、このサンプル ドキュメントを更新する例を紹介します。
{ "_id": 1, "color": "green", "qty": [8, 12, 18] }
このデータは、次の Kotlin データ クラスでモデル化されます。
data class PaintOrder( val id: Int, val qty: List<Int>, val color: String )
このページの例では、 MongoCollectionクラスの findOneAndUpdate()メソッドを使用してドキュメントを取得とアップデートを行います。 各例では、 FindOneAndUpdateOptionsクラスのインスタンスを使用して、更新後に MongoDB がドキュメントを取得するようにしています。 findOneAndUpdate()メソッドの詳細については、 複合操作 のガイドを参照してください。
更新を指定する
更新を指定するには、 Updatesビルダを使用します。 Updatesビルダは、アップデート仕様を構築するための静的ユーティリティ メソッドを提供します。
配列でUpdatesビルダを使用する方法の詳細については、 アップデート ビルダに関するガイド をご覧ください。
次の例では、これらのアクションを実行します。
サンプル ドキュメントのクエリ
クエリフィルターに一致するドキュメント内の
qty配列に「17」を追加します
val filter = Filters.eq("_id", 1) val update = Updates.push(PaintOrder::qty.name, 17) val options = FindOneAndUpdateOptions() .returnDocument(ReturnDocument.AFTER) val result = collection.findOneAndUpdate(filter, update, options) print(result)
PaintOrder(id=1, qty=[8, 12, 18, 17], color=green)
配列要素の指定
位置演算子を使用して、アップデートする配列要素を指定できます。 位置演算子は、アップデートする最初の配列要素、すべて、または特定の配列要素を指定できます。
位置演算子を使用して配列内の要素を指定するには、ドット表記を使用します。 ドット表記は、BSON オブジェクトを操作するためのプロパティ アクセス構文です。
詳細については、 ドット表記 に関するサーバー マニュアル エントリを参照してください。
最初に一致する配列要素
クエリフィルターに一致する最初の配列要素を更新するには、位置指定の$演算子を使用します。 位置指定の$演算子を使用するには、配列フィールドがクエリフィルターの一部として表示される必要があります。
例
次の例では、これらのアクションを実行します。
値が「18」を含む
qtyフィールドを持つドキュメントをクエリするクエリフィルターに一致するドキュメント内の最初の配列の値を "3" ずつ減算します
val filter = Filters.eq(PaintOrder::qty.name, 18) val update = Updates.inc("${PaintOrder::qty.name}.$", -3) val options = FindOneAndUpdateOptions() .returnDocument(ReturnDocument.AFTER) val result = collection.findOneAndUpdate(filter, update, options) print(result)
PaintOrder(id=1, qty=[8, 12, 15], color=green)
このセクションで述べられたメソッドと演算子の詳細については、次のリソースを参照してください。
すべての配列要素の一致
配列内のすべての要素を更新するには、すべての位置指定$[]演算子を使用します。
例
次の例では、これらのアクションを実行します。
サンプル ドキュメントのクエリ
クエリフィルターに一致する配列要素を "2" 倍します
val filter = Filters.eq("_id", 1) val update = Updates.mul("${PaintOrder::qty.name}.$[]", 2) val options = FindOneAndUpdateOptions() .returnDocument(ReturnDocument.AFTER) val result = collection.findOneAndUpdate(filter, update, options) println(result)
PaintOrder(id=1, qty=[16, 24, 36], color=green)
このセクションで述べられたメソッドと演算子の詳細については、次のリソースを参照してください。
すべての位置 $[] 演算子サーバー マニュアル エントリ
multi() APIドキュメント
複数の配列要素の一致
フィルターに一致する配列要素を更新するには、フィルタリングされた位置指定$[<identifier>]演算子を使用します。 アップデート操作に配列フィルターを含めて、アップデートする配列要素を指定する必要があります。
<identifier>は、配列フィルターに付ける名前です。 この値は小文字で始まり、含めることができるのは英数字のみです。
例
次の例では、これらのアクションを実行します。
サンプル ドキュメントのクエリ
配列フィルターを設定して、"15" 未満の値を検索
クエリフィルターに一致する配列要素を "5" ずつ増加させます
val filter = Filters.eq("_id", 1) val smallerFilter = Filters.lt("smaller", 15) val options = FindOneAndUpdateOptions() .returnDocument(ReturnDocument.AFTER) .arrayFilters(listOf(smallerFilter)) val update = Updates.inc("${PaintOrder::qty.name}.$[smaller]", 5) val result = collection.findOneAndUpdate(filter, update, options) println(result)
PaintOrder(id=1, qty=[13, 17, 18], color=green)
このセクションで述べられたメソッドと演算子の詳細については、次のリソースを参照してください。
フィルタリングされた位置 $[<identifier> ] 演算子 サーバー マニュアル エントリ
inc() APIドキュメント