MongoDBで条件に一致する複数のドキュメントを一括更新する方法(multiオプションの使い方)
MongoDBのupdate()メソッドは、デフォルトでは条件に一致した最初の1件のドキュメントしか更新しません。条件に一致する複数のドキュメントをまとめて更新したい場合は、第3引数に{ multi: true }を指定します。
この記事では、実際にコレクションを作成しながら、multiオプションを使った部分一括更新の手順を解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使って、テスト用のコレクションにドキュメントを挿入します。
> db.demo312.insertOne({"FirstName":"Robert"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50ce16f8647eb59e56204a")
}
> db.demo312.insertOne({"FirstName":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50ce19f8647eb59e56204b")
}
> db.demo312.insertOne({"FirstName":"Robert"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50ce1cf8647eb59e56204c")
}
> db.demo312.insertOne({"FirstName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50ce20f8647eb59e56204d")
}
> db.demo312.insertOne({"FirstName":"Robert"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e50ce22f8647eb59e56204e")
}この時点で、「Robert」という名前のドキュメントが3件登録されている状態です。
2. 登録されたドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo312.find();
実行結果は以下の通りです。
{ "_id" : ObjectId("5e50ce16f8647eb59e56204a"), "FirstName" : "Robert" }
{ "_id" : ObjectId("5e50ce19f8647eb59e56204b"), "FirstName" : "Bob" }
{ "_id" : ObjectId("5e50ce1cf8647eb59e56204c"), "FirstName" : "Robert" }
{ "_id" : ObjectId("5e50ce20f8647eb59e56204d"), "FirstName" : "David" }
{ "_id" : ObjectId("5e50ce22f8647eb59e56204e"), "FirstName" : "Robert" }3. multiオプションで複数ドキュメントを更新する
次に、「FirstName」が「Robert」であるすべてのドキュメントを「Sam」に変更してみます。update()メソッドの第3引数に{ multi: true }を渡すことで、条件に一致した全ドキュメントが更新対象になります。
> db.demo312.update({"FirstName":"Robert"},{$set:{"FirstName":"Sam"}},{multi:true});
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })実行結果のnMatched : 3は条件に一致したドキュメントが3件、nModified : 3は実際に3件が更新されたことを示しています。
4. 更新後のドキュメントを確認する
もう一度find()メソッドを実行して、更新結果を確認しましょう。
> db.demo312.find();
出力を見ると、「Robert」だった3件すべてが「Sam」に書き換わっていることが分かります。
{ "_id" : ObjectId("5e50ce16f8647eb59e56204a"), "FirstName" : "Sam" }
{ "_id" : ObjectId("5e50ce19f8647eb59e56204b"), "FirstName" : "Bob" }
{ "_id" : ObjectId("5e50ce1cf8647eb59e56204c"), "FirstName" : "Sam" }
{ "_id" : ObjectId("5e50ce20f8647eb59e56204d"), "FirstName" : "David" }
{ "_id" : ObjectId("5e50ce22f8647eb59e56204e"), "FirstName" : "Sam" }補足:updateMany()の活用もおすすめ
MongoDB 3.2以降では、{ multi: true }を指定せずとも、複数ドキュメントを一括更新できるupdateMany()メソッドが提供されています。新しいバージョンで開発している場合は、以下のように書く方がシンプルで推奨されています。
> db.demo312.updateMany({"FirstName":"Robert"},{$set:{"FirstName":"Sam"}});なお、単一ドキュメントのみを更新したい場合はupdateOne()を使うことで、意図しない大量更新を防ぐことができます。用途に応じてメソッドを使い分けましょう。
-
MongoDBで埋め込みドキュメント(配列内のサブドキュメント)をクエリする方法
MongoDBの埋め込みドキュメントをクエリするには?MongoDBでは、ドキュメントの中に配列として埋め込まれたサブドキュメントをクエリする場合、aggregate()メソッドを使用するのが効果的です。この記事では、$unwindと$matchを組み合わせて、埋め込みドキュメントから条件に合うデータを抽出する手順を解説します。1. サンプルコレクションの作成まずは、学生情報を配列として持つドキュメントを含むコレクションを作成しましょう。insertOne()メソッドを使ってドキュメントを挿入します。> db.demo705.insertOne( ... { ...
-
MongoDBで1つのクエリを使って複数のドキュメントを一括更新する方法(bulkWrite活用ガイド)
MongoDBで1つのクエリで複数のドキュメントを更新するには?MongoDBで1回のリクエスト(1つのクエリ)で複数のドキュメントを効率的に更新したい場合は、bulkWrite()メソッドを使用します。bulkWrite()は、複数の書き込み操作(insert、update、deleteなど)をまとめてサーバーに送信できるため、個別にクエリを発行するよりもパフォーマンス面で優れています。ここでは、updateOne操作を組み合わせて、複数のドキュメントのフィールドを一度に更新する手順を具体的に解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使って