MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

【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を使用するようにしましょう。

  1. MongoDBで特定の文字列を使ってフィールドのすべての値を一括更新する方法

    MongoDBでフィールドのすべての値を一括更新する方法MongoDBのコレクション内に存在するすべてのドキュメントの特定フィールドを、同じ文字列でまとめて更新したい場合があります。そのようなときは、update()メソッドにオプション「multi: true」を指定します。この記事では、実際のコマンド例をもとに、手順をわかりやすく解説します。1. サンプルコレクションの作成まずはinsertOne()メソッドを使って、テスト用コレクション「demo720」に複数のドキュメントを挿入します。> db.demo720.insertOne({SubjectName:MySQL}); {

  2. MongoDBでコレクション内のドキュメントの各フィールドを数式を使って更新する方法

    コレクション内のドキュメントの各フィールドを数式(計算式)で一括更新したい場合は、MongoDBの update() メソッドに $mul 演算子と全位置演算子 $[] を組み合わせて使用します。本記事では、配列内のすべての要素に対して特定のフィールドの値を乗算で更新する具体的な手順を解説します。サンプルコレクションの作成まず、insertOne() メソッドを使って、ドキュメントを含むコレクションを作成します。> db.demo749.insertOne({details:[{id:1,a:10},{id:2,a:5},{id:3,a:20}]}); { acknowledge