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

MongoDBで1つのクエリを使って複数のドキュメントを一括更新する方法(bulkWrite活用ガイド)

MongoDBで1つのクエリで複数のドキュメントを更新するには?

MongoDBで1回のリクエスト(1つのクエリ)で複数のドキュメントを効率的に更新したい場合は、bulkWrite()メソッドを使用します。bulkWrite()は、複数の書き込み操作(insert、update、deleteなど)をまとめてサーバーに送信できるため、個別にクエリを発行するよりもパフォーマンス面で優れています。

ここでは、updateOne操作を組み合わせて、複数のドキュメントのフィールドを一度に更新する手順を具体的に解説します。

1. コレクションの作成とドキュメントの挿入

まず、insertOne()メソッドを使ってサンプルドキュメントを含むコレクションを作成します。

> db.demo760.insertOne({id:1,details:{Value1:100,Value2:50}});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5eb0309f5637cd592b2a4aee")
}
> db.demo760.insertOne({id:2,details:{Value1:60,Value2:70}});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5eb030a15637cd592b2a4aef")
}
> db.demo760.insertOne({id:3,details:{Value1:80,Value2:90}});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5eb030a15637cd592b2a4af0")
}

2. 挿入したドキュメントの確認

find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。

> db.demo760.find();

これにより、次のような出力が得られます。

{ "_id" : ObjectId("5eb0309f5637cd592b2a4aee"), "id" : 1, "details" : { "Value1" : 100, "Value2" : 50 } }
{ "_id" : ObjectId("5eb030a15637cd592b2a4aef"), "id" : 2, "details" : { "Value1" : 60, "Value2" : 70 } }
{ "_id" : ObjectId("5eb030a15637cd592b2a4af0"), "id" : 3, "details" : { "Value1" : 80, "Value2" : 90 } }

3. bulkWrite()で複数のドキュメントを一括更新

以下は、MongoDBで1つのクエリを使って複数のドキュメントを更新するクエリの例です。updateOne操作を配列としてbulkWrite()に渡すことで、ドキュメントごとに異なる更新内容を一度に適用できます。

> db.demo760.bulkWrite([
...    {
...       updateOne: {
...          filter: {id: 1},
...          update: {$set: {'details.Value1': 900, 'details.Value2': 500}},
...    }
...    },
...    {
...    updateOne: {
...       filter: {id: 2},
...       update: {$set: {'details.Value1': 1000, 'details.Value2': 2000}},
...    },
... }
... ])
{
    "acknowledged" : true,
    "deletedCount" : 0,
    "insertedCount" : 0,
    "matchedCount" : 2,
    "upsertedCount" : 0,
    "insertedIds" : {
    },
    "upsertedIds" : {
    }
}

実行結果のmatchedCountが「2」となっていることから、2件のドキュメントが条件に一致し、正常に更新されたことがわかります。

4. 更新後のドキュメントを確認

再度find()メソッドを実行して、更新結果を確認しましょう。

> db.demo760.find();

これにより、次のような出力が得られます。

{ "_id" : ObjectId("5eb0309f5637cd592b2a4aee"), "id" : 1, "details" : { "Value1" : 900, "Value2" : 500 } }
{ "_id" : ObjectId("5eb030a15637cd592b2a4aef"), "id" : 2, "details" : { "Value1" : 1000, "Value2" : 2000 } }
{ "_id" : ObjectId("5eb030a15637cd592b2a4af0"), "id" : 3, "details" : { "Value1" : 80, "Value2" : 90 } }

この結果から、idが「1」と「2」のドキュメントのdetailsフィールド内にあるValue1とValue2が更新され、idが「3」のドキュメントは変更されていないことが確認できます。

補足:updateMany()との使い分け

同一の条件に一致するすべてのドキュメントに同じ更新を適用したい場合は、updateMany()メソッドが便利です。一方、ドキュメントごとに異なる値を設定したい場合や、複数種類の操作をまとめて実行したい場合は、bulkWrite()でupdateOne操作を組み合わせるのが最適です。用途に応じて使い分けることで、MongoDBの更新処理をより効率的に行えます。

  1. MongoDBで特定の文字列を含むドキュメントを検索する方法

    MongoDBで特定の文字列を含むドキュメントを検索するには、find()メソッドを使用し、その条件の中で正規表現(regex)を指定します。本記事では、実際にコレクションを作成しながら、特定の文字列を含むドキュメントを抽出する手順をわかりやすく解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使って、ドキュメントを含むコレクションを作成します。> db.demo409.insertOne({Name:John Doe}); {    acknowledged : true,    insertedId : Obje

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

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