MongoDBで配列内の複数の要素を一括更新する方法($[]演算子の使い方)
MongoDBで配列内の複数の要素を同時に更新したい場合には、全位置演算子 $[] を使用します。$[] は指定した配列フィールドに含まれるすべての要素に対して、更新操作を適用することを意味する特別な演算子です。
この記事では、実際のコード例を通して、$[] を使った配列の一括更新方法を順を追って解説します。
1. コレクションとドキュメントを作成する
まずは、サンプルとなるドキュメントを含むコレクションを作成しましょう。ここでは demo385 というコレクションに、「ServerLogs」という配列フィールドを持つドキュメントを挿入します。
> db.demo385.insertOne({
... "ServerLogs": [
... {
... "status": "InActive"
... },
... {
... "status": "InActive"
... },
... {
... "status": "InActive"
... }
... ]
... });
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5b6a7522064be7ab44e7f5")
}
挿入が完了すると、acknowledged: true が返され、ドキュメントが正常に登録されたことが確認できます。現時点では、3つのログエントリすべてが「InActive」状態になっています。
2. 作成したドキュメントを確認する
find() メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo385.find().pretty();
このクエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5e5b6a7522064be7ab44e7f5"),
"ServerLogs" : [
{
"status" : "InActive"
},
{
"status" : "InActive"
},
{
"status" : "InActive"
}
]
}
3. $[] を使って配列内の全要素を更新する
それでは、MongoDBで配列内の複数の要素をまとめて更新するクエリを見ていきましょう。ポイントは、ServerLogs.$[].status のように、配列名の直後に $[] を記述する点です。
> db.demo385.update(
... { "_id" : ObjectId("5e5b6a7522064be7ab44e7f5") },
... { "$set": { "ServerLogs.$[].status": "Active" }}
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
このクエリでは、次のような処理が行われています。
- 検索条件:
_idフィールドで対象ドキュメントを特定します。 - 更新内容:
$set演算子と$[]を組み合わせることで、ServerLogs配列内のすべての要素のstatusを「Active」に変更します。 - 実行結果:
nModified: 1により、1件のドキュメントが更新されたことがわかります。
4. 更新後の結果を確認する
もう一度 find() メソッドを実行して、更新結果を確認してみましょう。
> db.demo385.find().pretty();
実行すると、以下のようにすべての要素が「Active」に更新されていることが確認できます。
{
"_id" : ObjectId("5e5b6a7522064be7ab44e7f5"),
"ServerLogs" : [
{
"status" : "Active"
},
{
"status" : "Active"
},
{
"status" : "Active"
}
]
}
まとめ
MongoDBで配列内の複数(すべて)の要素を一度に更新するには、$[](全位置演算子)を使うのが最もシンプルで効率的な方法です。従来のようにループ処理や個別の更新を繰り返す必要がなく、たった1つの update クエリで配列全体を一括更新できます。
なお、条件に一致する一部の要素だけを更新したい場合は、$[<identifier>] と arrayFilters を組み合わせる方法もありますので、用途に応じて使い分けるとよいでしょう。
-
MongoDBで配列内の要素を更新する方法|$setと位置演算子$の使い方を解説
MongoDBで配列内の要素を更新する基本 MongoDBでドキュメント内の配列の要素を更新するには、update()メソッドに $set 演算子と位置演算子「$」を組み合わせて使用します。この組み合わせにより、クエリ条件に一致した配列要素だけをピンポイントで書き換えることができます。 ステップ1:コレクションの作成とドキュメントの挿入 まず、insertOne() メソッドを使ってサンプルデータを登録します。ここでは、大学名(CollegeName)と学費(Fees)を含む「CollegeDetails」という配列を持つドキュメントを1件作成しました。 > db.demo494.in
-
MongoDBで配列内の要素を一括更新する方法:Bulk操作による複数更新の実行
MongoDBで配列内の複数要素を一度に更新したい場合、initializeOrderedBulkOp()メソッドを活用するのが効果的です。このメソッドは、コレクションに対して新しいBulk()操作ビルダーを初期化して返します。ビルダーは、MongoDBが一括(バルク)で実行する順序付き書き込み操作のリストを構築します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。> db.demo550.insertOne({Name:Chris,details:[{Marks:49,Result:fail},{Marks:58,Result:fail}]}); {