MongoDBでサブドキュメントの配列を更新するには?$setと位置演算子の使い方を解説
MongoDBでサブドキュメントの配列を更新するには、update()メソッドと$set演算子を組み合わせて使用します。配列内の条件に一致した要素を指定する際には、位置演算子「$」が便利です。この記事では、実際にコレクションを作成し、サブドキュメントの配列を更新するまでの一連の手順を順を追って解説します。
1. コレクションの作成
まず、insertOne()メソッドを使って、ドキュメントを含むコレクションを作成しましょう。
>db.demo134.insertOne({"EmployeeId":101,"EmployeeDetails":[{"EmployeeName":"Chris","EmployeeAge":27},{"EmployeeName":"Bob","EmployeeAge":28}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e319b2f68e7f832db1a7f7c")
}
>db.demo134.insertOne({"EmployeeId":102,"EmployeeDetails":[{"EmployeeName":"David","EmployeeAge":24},{"EmployeeName":"Carol","EmployeeAge":29}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e319b4468e7f832db1a7f7d")
}2. 登録されたドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo134.find().pretty();
これを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e319b2f68e7f832db1a7f7c"),
"EmployeeId" : 101,
"EmployeeDetails" : [
{
"EmployeeName" : "Chris",
"EmployeeAge" : 27
},
{
"EmployeeName" : "Bob",
"EmployeeAge" : 28
}
]
}
{
"_id" : ObjectId("5e319b4468e7f832db1a7f7d"),
"EmployeeId" : 102,
"EmployeeDetails" : [
{
"EmployeeName" : "David",
"EmployeeAge" : 24
},
{
"EmployeeName" : "Carol",
"EmployeeAge" : 29
}
]
}3. サブドキュメントの配列を更新するクエリ
以下は、MongoDBでサブドキュメントの配列を更新するクエリの例です。検索条件(EmployeeIdが101かつEmployeeDetails.EmployeeNameが「Chris」)に一致した配列要素を位置演算子「$」で特定し、$setによって該当するフィールドのみを新しい値「Robert」で上書きしています。
> db.demo134.update(
... {
... "EmployeeId":101,
... "EmployeeDetails.EmployeeName":"Chris"
... },
... {
... $set: {
... "EmployeeDetails.$.EmployeeName" : "Robert"
... }
... }
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })4. 更新後のドキュメントを確認する
もう一度find()メソッドを実行し、更新が正しく反映されているか確認しましょう。
> db.demo134.find().pretty();
実行結果は以下の通りです。
{
"_id" : ObjectId("5e319b2f68e7f832db1a7f7c"),
"EmployeeId" : 101,
"EmployeeDetails" : [
{
"EmployeeName" : "Robert",
"EmployeeAge" : 27
},
{
"EmployeeName" : "Bob",
"EmployeeAge" : 28
}
]
}
{
"_id" : ObjectId("5e319b4468e7f832db1a7f7d"),
"EmployeeId" : 102,
"EmployeeDetails" : [
{
"EmployeeName" : "David",
"EmployeeAge" : 24
},
{
"EmployeeName" : "Carol",
"EmployeeAge" : 29
}
]
}まとめ
このように、update()と$set、そして位置演算子「$」を組み合わせることで、配列の中から条件に一致したサブドキュメントだけをピンポイントで更新できます。実行結果を見ると、EmployeeIdが101のドキュメント内にある「Chris」という従業員名だけが「Robert」に変更されており、他のドキュメントには一切影響していないことが確認できます。なお、現在のMongoDBでは、非推奨となったupdate()の代わりに、updateOne()やupdateMany()を使用することが推奨されているので、実務ではこちらを選択するとよいでしょう。
-
MongoDBクエリでサブドキュメント(埋め込みドキュメント)にアクセスする方法
MongoDBでサブドキュメント(埋め込みドキュメント)にアクセスするには、find()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記では、「親フィールド名.子フィールド名」の形式でネストされたフィールドを指定できます。1. コレクションとドキュメントの作成まず、サブドキュメントを含むドキュメントを持つコレクションを作成しましょう。 db.demo670.insertOne({ id:102, details: { Name:David, Age:22, CountryName:UK, SubjectName:MySQL } } ); { ackno
-
MongoDBで配列の要素を削除するには?$pull演算子の使い方を解説
MongoDBで配列から要素を削除する基本MongoDBで配列内の要素を削除したい場合は、$pull演算子を使用します。$pullは、既存の配列から指定した値、または条件に一致するすべてのインスタンスを取り除くための更新演算子です。この記事では、実際にコレクションを作成し、ネストされた配列から特定の要素を削除する手順を順番に解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。ここでは「software」フィールドの中に「services」という配列を持つドキュメントを挿入します。db.demo541.insertOne({software:{servic