Docs Menu
Docs Home
/ / /
Kotlin コルーチン
/ / /

ドキュメント内の配列の更新

項目一覧

  • Overview
  • サンプルドキュメント
  • 更新を指定する
  • 配列要素の指定
  • 最初に一致する配列要素
  • すべての配列要素の一致
  • 複数の配列要素の一致

このガイドでは、MongoDB Kotlin ドライバーを使用してドキュメント内の配列をアップデートする方法を学習できます。

配列を更新するには、次の操作を行う必要があります。

  • 実行する更新を指定する

  • アップデートを適用する配列要素を指定する

  • これらの仕様を使用して更新操作を実行します

次のセクションでは、このサンプル ドキュメントを更新する例を紹介します。

{ "_id": 1, "color": "green", "qty": [8, 12, 18] }

このデータは、次の Kotlin データ クラスでモデル化されます。

data class PaintOrder(
@BsonId 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)

このセクションで述べられたメソッドと演算子の詳細については、次のリソースを参照してください。

フィルターに一致する配列要素を更新するには、フィルタリングされた位置指定$[<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)

このセクションで述べられたメソッドと演算子の詳細については、次のリソースを参照してください。

戻る

ドキュメントの変更