MongoDBで複数のドキュメントをアトミックに一括更新する方法
MongoDBでは、update()メソッドに更新演算子の$setを組み合わせることで、条件に一致した複数のドキュメントをまとめてアトミックに更新できます。本記事では、サンプルコレクションを使いながら、その具体的な手順を解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成します。
> db.demo699.insertOne({Name:"Chris Brown"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6e370551299a9f98c93a7")
}
> db.demo699.insertOne({Name:"David Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6e37a551299a9f98c93a8")
}
> db.demo699.insertOne({Name:"Chris Brown"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6e381551299a9f98c93a9")
}
> db.demo699.insertOne({Name:"John Doe"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea6e38a551299a9f98c93aa")
}
このコレクションには「Chris Brown」が2件、「David Miller」と「John Doe」がそれぞれ1件登録されています。
2. 登録済みドキュメントの確認
find()メソッドを使用して、コレクション内のすべてのドキュメントを表示します。
> db.demo699.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5ea6e370551299a9f98c93a7"), "Name" : "Chris Brown" }
{ "_id" : ObjectId("5ea6e37a551299a9f98c93a8"), "Name" : "David Miller" }
{ "_id" : ObjectId("5ea6e381551299a9f98c93a9"), "Name" : "Chris Brown" }
{ "_id" : ObjectId("5ea6e38a551299a9f98c93aa"), "Name" : "John Doe" }
3. 複数ドキュメントの一括更新(アトミックアップデート)
続いて、「Name」フィールドが「Chris Brown」であるすべてのドキュメントを「Adam Smith」へ一括更新するクエリを実行します。第4引数に true を指定することで、マルチドキュメント更新(複数件への適用)が有効になります。
> db.demo699.update({Name:"Chris Brown"},{ $set : { Name: "Adam Smith"} }, false, true );
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
結果を見ると、「2件がマッチし、2件が更新された」(nMatched: 2 / nModified: 2)ことがわかります。$set演算子は指定されたフィールドのみを変更するため、他のフィールドには影響しません。
4. 更新結果の確認
再度find()メソッドを実行して、更新後のコレクション全体を確認しましょう。
> db.demo699.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5ea6e370551299a9f98c93a7"), "Name" : "Adam Smith" }
{ "_id" : ObjectId("5ea6e37a551299a9f98c93a8"), "Name" : "Adam Smith" }
{ "_id" : ObjectId("5ea6e381551299a9f98c93a9"), "Name" : "Adam Smith" }
{ "_id" : ObjectId("5ea6e38a551299a9f98c93aa"), "Name" : "Adam Smith" }
この出力には誤りがあります。正しい結果は以下のとおりです。「Chris Brown」だった2件のみが「Adam Smith」に更新され、その他のドキュメントはそのまま維持されます。
{ "_id" : ObjectId("5ea6e370551299a9f98c93a7"), "Name" : "Adam Smith" }
{ "_id" : ObjectId("5ea6e37a551299a9f98c93a8"), "Name" : "David Miller" }
{ "_id" : ObjectId("5ea6e381551299a9f98c93a9"), "Name" : "Adam Smith" }
{ "_id" : ObjectId("5ea6e38a551299a9f98c93aa"), "Name" : "John Doe" }
補足:モダンな書き方としてのupdateMany()
上記のupdate()メソッドは旧来の構文です。現在のMongoDB(バージョン4.2以降)では、より直感的なupdateMany()メソッドの使用が推奨されています。
> db.demo699.updateMany(
... { Name: "Chris Brown" },
... { $set: { Name: "Adam Smith" } }
... );
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
updateMany()は、条件に一致するすべてのドキュメントを自動的に更新対象とするため、マルチフラグを意識する必要がなく、コードの可読性も向上します。なお、単一のドキュメントのみを更新したい場合はupdateOne()を使用してください。
まとめ
$set演算子を使うことで、指定したフィールドだけを安全に更新できます。- 旧構文の
update()では、第4引数にtrueを渡すことで複数ドキュメントへの更新が可能です。 - 現在は
updateMany()を使うのがベストプラクティスです。
-
MongoDBのアグリゲーションで$redact演算子を使う方法
$redact演算子とはMongoDBの$redactステージは、ドキュメント自体に格納されている情報に基づいて、各ドキュメントの内容を制限(フィルタリング)するための機能です。アグリゲーションフレームワークでは、$cond演算子を$redactと組み合わせることで、条件に応じてドキュメントを保持($$KEEP)するか除外($$PRUNE)するかを柔軟に制御できます。ここでは、実際のコード例を通して、$redactの基本的な使い方を見ていきましょう。サンプルコレクションの作成まず、insertOne()メソッドを使って、複数のドキュメントを含むコレクションを作成します。> db.demo
-
MongoDBのupdateOne()とinsertOne()の違いと使い方を実例で解説
MongoDBには、コレクションへのドキュメント追加や更新を行うための便利なメソッドが多数用意されています。本記事では、その中でも特によく使われる insertOne() と updateOne() の役割の違いと具体的な使い方を、実際のコード例とともにわかりやすく解説します。insertOne():コレクションに新しいドキュメントを1件挿入するメソッドです。updateOne():クエリフィルタ(検索条件)に一致したドキュメントのうち、最初の1件のみを更新するメソッドです。insertOne()でサンプルコレクションを作成するまずは insertOne() を使って、サンプル用のコレクション