MongoDBクエリ:コレクション内の特定のドキュメントを更新する方法
MongoDBで特定のドキュメントを更新する基本
MongoDBでコレクション内の特定のドキュメント(特に配列内の要素)を更新するには、update()メソッドと$set演算子を組み合わせて使用します。さらに、配列の中から条件に一致した要素だけを更新したい場合は、位置演算子「$」を活用すると非常に便利です。
本記事では、実際のコード例を通じて、配列内の特定ドキュメントを更新する手順を順番に解説していきます。
1. サンプルコレクションの作成
まず、従業員情報を格納したドキュメントを持つコレクション「demo135」を作成します。
> db.demo135.insertOne({"Details":[{"EmployeeId":101,"EmployeeName":"Chris","EmployeeSalary":45000},{"EmployeeId":102,"EmployeeName":"Chris","EmployeeSalary":45000}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e31a5ddfdf09dd6d085399c")
}挿入が成功すると、acknowledged : true と自動採番された insertedId が返されます。
2. ドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo135.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e31a5ddfdf09dd6d085399c"),
"Details" : [
{
"EmployeeId" : 101,
"EmployeeName" : "Chris",
"EmployeeSalary" : 45000
},
{
"EmployeeId" : 102,
"EmployeeName" : "Chris",
"EmployeeSalary" : 45000
}
]
}現在、「Details」配列には2つの従業員情報が格納されており、どちらも名前が「Chris」になっています。
3. 配列内の特定要素を更新するクエリ
ここでは、2番目のドキュメント(EmployeeId が 102 の要素)の「EmployeeName」を更新します。ポイントは、検索条件で "Details.EmployeeId": 102 と指定し、更新内容側では "Details.$.EmployeeName" のように位置演算子「$」を使うことです。こうすることで、条件に一致した配列要素だけが正確に更新されます。
> db.demo135.update(
... {
... "Details.EmployeeId":102,
... },
... {
... $set: {
... "Details.$.EmployeeName" : "John Doe"
... }
... }
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })実行結果の nMatched : 1 および nModified : 1 から、1件のドキュメントが条件に一致し、正常に更新されたことがわかります。
4. 更新後の確認
もう一度 find()メソッドを実行して、更新が反映されているか確認しましょう。
> db.demo135.find().pretty();
実行結果:
{
"_id" : ObjectId("5e31a5ddfdf09dd6d085399c"),
"Details" : [
{
"EmployeeId" : 101,
"EmployeeName" : "Chris",
"EmployeeSalary" : 45000
},
{
"EmployeeId" : 102,
"EmployeeName" : "John Doe",
"EmployeeSalary" : 45000
}
]
}EmployeeId が 102 の要素について、EmployeeName が「Chris」から「John Doe」へ正しく更新されていることが確認できます。一方、EmployeeId 101 の要素は影響を受けていません。
補足:最新のMongoDBでの推奨される書き方
MongoDBの新しいバージョンでは、従来の update() メソッドは非推奨となっており、代わりに updateOne() や updateMany() の使用が推奨されています。上記と同じ処理は、次のように記述できます。
db.demo135.updateOne(
{ "Details.EmployeeId": 102 },
{ $set: { "Details.$.EmployeeName": "John Doe" } }
);いずれの方法でも、$set 演算子と位置演算子「$」を組み合わせることで、配列内の特定の要素だけを効率的かつ安全に更新することが可能です。意図しないドキュメント全体の上書きを避けるためにも、更新時は必ず $set を使うことをおすすめします。
-
【MongoDB】ネストされた(入れ子構造の)ドキュメントを更新するクエリの書き方
MongoDBでは、入れ子(ネスト)になったサブドキュメントのフィールドを更新する際、update()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記を使うことで、深い階層にあるフィールドを直接指定して値を変更できます。1. サンプルコレクションの作成まず、ネストされたドキュメントを含むコレクションを作成しましょう。以下のコマンドでdemo607というコレクションにドキュメントを挿入します。> db.demo607.insertOne( ... { ... id: 1, ... Info1 : { ...
-
MongoDBドキュメントから特定の値をフィルタリングする方法
MongoDBドキュメントから特定の値をフィルタリングする方法MongoDBでドキュメント内の配列から特定の値を抽出したい場合は、集計パイプラインで $filter を使用します。この記事では、実際にコレクションを作成し、特定の条件に一致する要素だけをフィルタリングする手順を、サンプルコードとともに解説します。1. サンプルコレクションの作成まず、insertOne() メソッドを使って、配列フィールドを含むドキュメントを持つコレクションを作成します。 db.demo751.insertOne( ... { ... _id: 101, ... details: [