MongoDBでキーと値のペアのリストから複数ドキュメントを一括更新する方法
MongoDBでキーと値のペアのリストから複数のドキュメントを一括更新する方法
MongoDBでは、キーと値のペアを格納したリストをもとに、コレクション内の複数ドキュメントを効率よく一括更新できます。本記事では、initializeUnorderedBulkOp()によるバルク操作を使い、リスト内の各_idに対応するドキュメントのNameフィールドをまとめて更新する手順を、サンプルコードとともに解説します。
1. ドキュメントを含むコレクションの作成
まず、insertOne()メソッドを使ってサンプルデータを登録したコレクションdemo227を作成します。
> db.demo227.insertOne({"_id":"101","Name":"Chris"});
{ "acknowledged" : true, "insertedId" : "101" }
> db.demo227.insertOne({"_id":"102","Name":"Bob"});
{ "acknowledged" : true, "insertedId" : "102" }2. コレクション内の全ドキュメントを表示する
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo227.find();
実行すると、次のような出力が得られます。
{ "_id" : "101", "Name" : "Chris" }
{ "_id" : "102", "Name" : "Bob" }3. キーと値のペアのリストから一連のドキュメントを更新するクエリ
続いて、キーと値のペアのリストをもとに複数のドキュメントを更新するクエリを見ていきましょう。更新内容を配列として定義し、forループで各要素を処理した上で、バルク操作として一括実行しています。
> var bulkUpdateValue = [{"_id": "101", "Name": "Robert"},
... {"_id": "102", "Name": "Sam"}
...];
> var bulkUpdate = db.demo227.initializeUnorderedBulkOp();
> var updateCounter= undefined;
> for (var i = 0; i < bulkUpdateValue.length; i++){
... updateCounter = bulkUpdateValue[i];
... bulkUpdate.find( {_id: updateCounter._id} ).update( {$set: {Name: updateCounter.Name}} );
... }
> bulkUpdate.execute();
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 0,
"nUpserted" : 0,
"nMatched" : 2,
"nModified" : 2,
"nRemoved" : 0,
"upserted" : [ ]
})このコードのポイントは以下の通りです。
- initializeUnorderedBulkOp():バルク操作オブジェクトを初期化します。順序なし(unordered)モードのため、並列実行が可能になりパフォーマンスが向上します。
- find() と $set:各リスト要素の_idに一致するドキュメントを検索し、$set演算子でNameフィールドを新しい値に更新します。
- execute():保留されていたすべての更新操作を一括で実行します。
4. 更新結果の確認
もう一度find()メソッドを実行して、更新後のドキュメントを確認しましょう。
> db.demo227.find();
実行すると、次のようにドキュメントが正しく更新されていることが分かります。
{ "_id" : "101", "Name" : "Robert" }
{ "_id" : "102", "Name" : "Sam" }まとめ
BulkWriteResultの出力にある「nMatched : 2」「nModified : 2」は、2件のドキュメントが検索条件に一致し、そのすべてが正常に更新されたことを意味します。この手法を使えば、updateOne()を個別に何度も呼び出す場合と比べて通信回数を大幅に削減できるため、大量のドキュメントを効率的に更新したい場合に非常に有効です。
-
MongoDBでドキュメント内の配列から特定の値を削除する方法($pull演算子の使い方)
MongoDBで配列から値を削除したい場合は、$pull 演算子を使用します。$pull は、既存の配列から指定した条件に一致する値(または複数の値)のすべてのインスタンスを取り除くための更新演算子です。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。> db.demo535.insertOne( ... { ... studentId : 101, ... studentName : Chris, ... ListOfMailIds : [ ... Chris@gmail.com, ... Chr
-
MongoDBシェルで特定の値を持つドキュメントを取得する方法をわかりやすく解説
MongoDBシェルを使って特定の値を持つアイテムを取得する方法MongoDBで特定の値を持つドキュメントを取得したい場合、find()メソッドを使用するのが基本です。この記事では、サンプルコレクションを作成し、実際にfind()メソッドを使って条件に合うデータを抽出する手順を詳しく解説します。1. サンプルコレクションの作成まずはinsertOne()メソッドを使って、テスト用のコレクション「demo563」に複数のドキュメントを挿入します。> db.demo563.insertOne({Name:Chris,Age:21,isMarried:true}){ acknowled