【MongoDB】一致したフィールドに応じてドキュメントを条件付き更新する方法
MongoDBで一致したフィールドに応じた条件付き更新とは
MongoDBで条件付き更新(特定のフィールドが一致したドキュメントだけを更新する処理)を行うには、update()メソッドを使用し、$set演算子で新しい値を設定します。
なお、MongoDB 3.2以降では、1件だけ更新する場合はupdateOne()、条件に一致したすべてのドキュメントを更新する場合はupdateMany()の使用が推奨されています。本記事では基本的な流れを理解しやすいよう、従来のupdate()メソッドを使って解説します。
1. サンプルコレクションの作成
まず、学生情報のドキュメントを格納するコレクションを作成します。
> db.demo150.insertOne({"StudentId":101,"StudentName":"Chris","StudentMarks":35});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e350dcdfdf09dd6d08539d3")
}
> db.demo150.insertOne({"StudentId":102,"StudentName":"Chris","StudentMarks":55});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e350dcefdf09dd6d08539d4")
}
> db.demo150.insertOne({"StudentId":103,"StudentName":"David","StudentMarks":34});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e350dcffdf09dd6d08539d5")
}
> db.demo150.insertOne({"StudentId":104,"StudentName":"Chris","StudentMarks":38});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e350dd0fdf09dd6d08539d6")
}
2. 作成したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo150.find();
上記のコマンドを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e350dcdfdf09dd6d08539d3"), "StudentId" : 101, "StudentName" : "Chris", "StudentMarks" : 35 }
{ "_id" : ObjectId("5e350dcefdf09dd6d08539d4"), "StudentId" : 102, "StudentName" : "Chris", "StudentMarks" : 55 }
{ "_id" : ObjectId("5e350dcffdf09dd6d08539d5"), "StudentId" : 103, "StudentName" : "David", "StudentMarks" : 34 }
{ "_id" : ObjectId("5e350dd0fdf09dd6d08539d6"), "StudentId" : 104, "StudentName" : "Chris", "StudentMarks" : 38 }
3. 条件に一致したドキュメントの更新
以下は、「StudentIdが103」という条件に一致したドキュメントに対して、StudentMarksの値を97に更新するクエリです。
> db.demo150.update({"StudentId":103},{$set:{"StudentMarks":97}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
WriteResultの出力を見ると、「nMatched : 1」で1件のドキュメントが条件に一致し、「nModified : 1」でそのうち1件が実際に更新されたことが分かります。「nUpserted : 0」は、新規ドキュメントが挿入されていないことを示しています。
4. 更新結果の確認
もう一度find()メソッドを実行して、更新が正しく反映されているか確認しましょう。
> db.demo150.find();
実行結果:
{ "_id" : ObjectId("5e350dcdfdf09dd6d08539d3"), "StudentId" : 101, "StudentName" : "Chris", "StudentMarks" : 35 }
{ "_id" : ObjectId("5e350dcefdf09dd6d08539d4"), "StudentId" : 102, "StudentName" : "Chris", "StudentMarks" : 55 }
{ "_id" : ObjectId("5e350dcffdf09dd6d08539d5"), "StudentId" : 103, "StudentName" : "David", "StudentMarks" : 97 }
{ "_id" : ObjectId("5e350dd0fdf09dd6d08539d6"), "StudentId" : 104, "StudentName" : "Chris", "StudentMarks" : 38 }
このように、StudentIdが103のDavidさんのStudentMarksだけが34から97に更新され、他のドキュメントには一切影響していないことが確認できます。$setを使わずに更新フィールドを指定すると、ドキュメント全体が置き換えられてしまうため、部分更新の際は必ず$setを使用するようにしましょう。
-
MongoDBで特定の文字列を使ってフィールドのすべての値を一括更新する方法
MongoDBでフィールドのすべての値を一括更新する方法MongoDBのコレクション内に存在するすべてのドキュメントの特定フィールドを、同じ文字列でまとめて更新したい場合があります。そのようなときは、update()メソッドにオプション「multi: true」を指定します。この記事では、実際のコマンド例をもとに、手順をわかりやすく解説します。1. サンプルコレクションの作成まずはinsertOne()メソッドを使って、テスト用コレクション「demo720」に複数のドキュメントを挿入します。> db.demo720.insertOne({SubjectName:MySQL}); {
-
MongoDBでコレクション内のドキュメントの各フィールドを数式を使って更新する方法
コレクション内のドキュメントの各フィールドを数式(計算式)で一括更新したい場合は、MongoDBの update() メソッドに $mul 演算子と全位置演算子 $[] を組み合わせて使用します。本記事では、配列内のすべての要素に対して特定のフィールドの値を乗算で更新する具体的な手順を解説します。サンプルコレクションの作成まず、insertOne() メソッドを使って、ドキュメントを含むコレクションを作成します。> db.demo749.insertOne({details:[{id:1,a:10},{id:2,a:5},{id:3,a:20}]}); { acknowledge