MongoDBでドキュメント内の単一の配列要素を更新する方法(位置演算子$の使い方)
MongoDBで配列内の特定の要素だけを更新するには
MongoDBのドキュメントに含まれる配列(リスト)の中から、特定の1つの要素だけを更新したい場合には、位置演算子($)を使用します。位置演算子を使うことで、クエリ条件に一致した配列要素を直接指定して更新できます。
この記事では、実際のコード例を通じて、位置演算子$による配列要素の更新方法を解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。従業員情報を持つドキュメントを挿入してみましょう。
> db.updateASingleListDemo.insertOne({ _id:1, "EmployeeName":"Chris", "EmployeeDetails": [ {"EmployeeId":"EMP-101","EmployeeSalary": 18999 }] });
{ "acknowledged" : true, "insertedId" : 1 }2. 挿入したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.updateASingleListDemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : 1,
"EmployeeName" : "Chris",
"EmployeeDetails" : [
{
"EmployeeId" : "EMP-101",
"EmployeeSalary" : 18999
}
]
}3. 位置演算子($)を使った配列要素の更新
ここからが本題です。MongoDBドキュメント内の単一の配列要素を更新するクエリを見ていきましょう。この例では、従業員の給与(EmployeeSalary)を更新します。
> db.updateASingleListDemo.update({_id: 1, 'EmployeeDetails.EmployeeId': "EMP-101"}, {$inc: {'EmployeeDetails.$.EmployeeSalary': 1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })ポイントは以下の通りです。
- クエリ条件として_id: 1とEmployeeDetails.EmployeeId: "EMP-101"を指定することで、更新対象の配列要素を特定しています。
- 更新部分のEmployeeDetails.$.EmployeeSalaryにある「$」が位置演算子です。条件に一致した配列要素のインデックスを自動的に参照します。
- 更新演算子には$incを使用し、給与を1増加させています。
実行結果の「nModified: 1」から、1件のドキュメントが正常に更新されたことがわかります。
4. 更新後のドキュメントの確認
もう一度find()メソッドでドキュメントを確認してみましょう。
> db.updateASingleListDemo.find().pretty();
実行すると、次の出力が得られます。
{
"_id" : 1,
"EmployeeName" : "Chris",
"EmployeeDetails" : [
{
"EmployeeId" : "EMP-101",
"EmployeeSalary" : 19000
}
]
}EmployeeSalaryが「18999」から「19000」に更新されていることが確認できます。このように、位置演算子($)を活用すれば、配列全体を置き換えることなく、条件に一致した特定の要素だけを効率的に更新できます。
補足:update()メソッドについて
なお、上記の例で使用しているupdate()メソッドは非推奨となっており、現在のMongoDBではupdateOne()やupdateMany()の使用が推奨されています。同じ処理は次のように書き換えられます。
> db.updateASingleListDemo.updateOne(
... { _id: 1, 'EmployeeDetails.EmployeeId': "EMP-101" },
... { $inc: { 'EmployeeDetails.$.EmployeeSalary': 1 } }
... );新しいメソッドでも位置演算子$の使い方はまったく同じなので、安心して利用できます。
-
MongoDBでネストされたドキュメントを更新する方法|位置演算子$を使った配列要素の更新手順
MongoDBでは、ドキュメント内の配列に格納されたネストされた(入れ子の)ドキュメントも、位置演算子「$」を使うことで効率的に更新できます。この記事では、実際のコード例を通じて、配列内の特定のサブドキュメントを更新する手順をわかりやすく解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ネストされたドキュメントを含むコレクションを作成します。ここでは「Information」というフィールドに、複数のサブドキュメントを持つ配列を格納しています。 > db.demo595.insertOne( { Information: [ { _i
-
【MongoDB】ネストされた(入れ子構造の)ドキュメントを更新するクエリの書き方
MongoDBでは、入れ子(ネスト)になったサブドキュメントのフィールドを更新する際、update()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記を使うことで、深い階層にあるフィールドを直接指定して値を変更できます。1. サンプルコレクションの作成まず、ネストされたドキュメントを含むコレクションを作成しましょう。以下のコマンドでdemo607というコレクションにドキュメントを挿入します。> db.demo607.insertOne( ... { ... id: 1, ... Info1 : { ...