ドキュメント内の配列の更新
Overview
このガイドでは、MongoDB Java ドライバーを使用してドキュメント内の配列を更新する方法を学習できます。
配列を更新するには、次の操作を行う必要があります。
実行する更新を指定する
アップデートを適用する配列要素を指定する
これらの仕様を使用して更新操作を実行します
サンプルドキュメント
次のセクションでは、このサンプル ドキュメントを更新する例を紹介します。
{ "_id": 1, "color": "green", "qty": [8, 12, 18] }
このページの例では、 MongoCollection
クラスの findOneAndUpdate()
メソッドを使用してドキュメントを取得とアップデートを行います。 各例では、 FindOneAndUpdateOptions
クラスのインスタンスを使用して、更新後に MongoDB がドキュメントを取得するようにしています。 findOneAndUpdate()
メソッドの詳細については、 複合操作 のガイドを参照してください。
更新を指定する
更新を指定するには、 Updates
ビルダを使用します。 Updates
ビルダは、アップデート仕様を構築するための静的ユーティリティ メソッドを提供します。 配列でUpdates
ビルダを使用する方法の詳細については、 アップデート ビルダに関するガイド をご覧ください。
次の例では、これらのアクションを実行します。
サンプル ドキュメントのクエリ
クエリフィルターに一致するドキュメント内の
qty
配列に「17」を追加します
Bson filter = Filters.eq("_id", 1); Bson update = Updates.push("qty", 17); // Defines options that configure the operation to return a document in its post-operation state FindOneAndUpdateOptions options = new FindOneAndUpdateOptions() .returnDocument(ReturnDocument.AFTER); // Updates the first document that matches the filter and prints the updated document as JSON Document result = collection.findOneAndUpdate(filter, update, options); System.out.println(result.toJson());
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "green", "qty": [8, 12, 18, 17] }
配列要素の指定
位置演算子を使用して、アップデートする配列要素を指定できます。 位置演算子は、アップデートする最初の配列要素、すべて、または特定の配列要素を指定できます。
位置演算子を使用して配列内の要素を指定するには、ドット表記を使用します。 ドット表記は、BSON オブジェクトを操作するためのプロパティ アクセス構文です。
詳細については、 ドット表記 に関するサーバー マニュアル エントリを参照してください。
最初に一致する配列要素
クエリフィルターに一致する最初の配列要素を更新するには、位置指定の$
演算子を使用します。 位置指定の$
演算子を使用するには、配列フィールドがクエリフィルターの一部として表示される必要があります。
例
次の例では、これらのアクションを実行します。
値が「18」を含む
qty
フィールドを持つドキュメントをクエリするクエリフィルターに一致するドキュメント内の最初の配列の値を "3" ずつ減算します
Bson filter = Filters.eq("qty", 18); Bson update = Updates.inc("qty.$", -3); // Defines options that configure the operation to return a document in its post-operation state FindOneAndUpdateOptions options = new FindOneAndUpdateOptions() .returnDocument(ReturnDocument.AFTER); // Updates the first document that matches the filter and prints the updated document as JSON Document result = collection.findOneAndUpdate(filter, update, options); System.out.println(result.toJson());
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "green", "qty": [8, 12, 15] }
このセクションで述べられたメソッドと演算子の詳細については、次のリソースを参照してください。
すべての配列要素の一致
配列内のすべての要素を更新するには、すべての位置指定$[]
演算子を使用します。
例
次の例では、これらのアクションを実行します。
サンプル ドキュメントのクエリ
クエリフィルターに一致する配列要素を "2" 倍します
Bson filter = Filters.eq("_id", 1); Bson update = Updates.mul("qty.$[]", 2); // Defines options that configure the operation to return a document in its post-operation state FindOneAndUpdateOptions options = new FindOneAndUpdateOptions() .returnDocument(ReturnDocument.AFTER); // Updates the first document that matches the filter and prints the updated document as JSON Document result = collection.findOneAndUpdate(filter, update, options); System.out.println(result.toJson());
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "green", "qty": [16, 24, 36] }
このセクションで述べられたメソッドと演算子の詳細については、次のリソースを参照してください。
すべての位置 $[] 演算子サーバー マニュアル エントリ
multi() API ドキュメント
複数の配列要素の一致
フィルターに一致する配列要素を更新するには、フィルタリングされた位置指定$[<identifier>]
演算子を使用します。 アップデート操作に配列フィルターを含めて、アップデートする配列要素を指定する必要があります。
<identifier>
は、配列フィルターに付ける名前です。 この値は小文字で始まり、含めることができるのは英数字のみです。
例
次の例では、これらのアクションを実行します。
サンプル ドキュメントのクエリ
配列フィルターを設定して、"15" 未満の値を検索
クエリフィルターに一致する配列要素を "5" ずつ増加させます
Bson filter = Filters.eq("_id", 1); Bson smallerFilter = Filters.lt("smaller", 15); // Defines options that configure the document's return state and apply the array value filter FindOneAndUpdateOptions options = new FindOneAndUpdateOptions() .returnDocument(ReturnDocument.AFTER) .arrayFilters(Arrays.asList(smallerFilter)); // Creates an update document to increase the matched array values by "5" Bson update = Updates.inc("qty.$[smaller]", 5); // Updates the first document that matches the filter and prints the updated document as JSON Document result = collection.findOneAndUpdate(filter, update, options); System.out.println(result.toJson());
上記の例では、元のドキュメントを次の状態にアップデートします。
{ "_id": 1, "color": "green", "qty": [13, 17, 18] }
このセクションで述べられたメソッドと演算子の詳細については、次のリソースを参照してください。
フィルタリングされた位置 $[<identifier> ] 演算子 サーバー マニュアル エントリ
Inc() API ドキュメント