一括操作の実行
bulkWrite()
メソッドは、単一のコレクションに対してバッチ書き込み操作を実行します。この方法により、アプリケーションからサーバーへのネットワーク ラウンド トリップの回数が減り、スループットとパフォーマンスが向上します。一括書き込みでは、メソッドに渡されたすべての操作が完了した後にのみ、すべての操作の結果のコレクションが返されます。
bulkWrite()
では、次の書き込み操作を 1 つ以上指定できます。
insertOne
updateOne
updateMany
deleteOne
deleteMany
replaceOne
bulkWrite()
メソッドは次のパラメーターを受け入れます:
operations
: 実行する一括書き込み操作を指定します。 各操作を配列内のオブジェクトとしてbulkWrite()
に渡します。各書き込み操作の構文を示す例については、bulkWrite API ドキュメントを参照してください。options
: 書き込み操作が順番に実行されるかどうかや 書込み保証 (write concern) など、操作の実行に影響するオプションの設定。デフォルトでは、MongoDB は指定された順序(連続)で一括書き込み操作を 1 つずつ実行します。 順序付き一括書込み中に、操作の処理中にエラーが発生した場合、MongoDB はリスト内の残りの操作を処理せずに返します。 対照的に、
ordered
がfalse
の場合、MongoDB はリスト内の残りの書込み操作の処理を続行します。 順序なし操作は MongoDB が並列に実行できるため、論理的には高速ですが、書込みが順序に依存しない場合にのみ使用します。
一意のインデックス制約を使用してインデックスを作成すると、次の形式の操作中に重複キー書込みエラーが発生する可能性があります。
Error during bulkWrite, BulkWriteError: E11000 duplicate key error collection: ...
同様に、スキーマ検証を使用するコレクションに対して 一括書込み を実行しようとすると、挿入または変更されたドキュメントの形式に関連する警告やエラーが発生する可能性があります。
例
次のコード サンプルは、sample_mflix
データベースの theaters
コレクションに対して一括書き込み操作を実行します。bulkWrite()
の呼び出し例には、insertOne
、updateMany
、および deleteOne
の書き込み操作の例が含まれています。
注意
この例を使用して、MongoDB のインスタンスに接続し、サンプルデータを含むデータベースと交流できます。MongoDB インスタンスへの接続とサンプルデータセットの読み込みの詳細については、 使用例ガイドを参照してください。
1 // Bulk write operation 2 3 // Import MongoClient from the MongoDB node driver package 4 const { MongoClient } = require("mongodb"); 5 6 // Replace the uri string with your MongoDB deployment's connection string 7 const uri = "<connection string uri>"; 8 9 const client = new MongoClient(uri); 10 11 async function run() { 12 try { 13 const database = client.db("sample_mflix"); 14 const theaters = database.collection("theaters"); 15 16 // Insert a new document into the "theaters" collection 17 const result = await theaters.bulkWrite([ 18 { 19 insertOne: { 20 document: { 21 location: { 22 address: { 23 street1: "3 Main St.", 24 city: "Anchorage", 25 state: "AK", 26 zipcode: "99501", 27 }, 28 }, 29 }, 30 }, 31 }, 32 { 33 insertOne: { 34 document: { 35 location: { 36 address: { 37 street1: "75 Penn Plaza", 38 city: "New York", 39 state: "NY", 40 zipcode: "10001", 41 }, 42 }, 43 }, 44 }, 45 }, 46 { 47 // Update documents that match the specified filter 48 updateMany: { 49 filter: { "location.address.zipcode": "44011" }, 50 update: { $set: { is_in_ohio: true } }, 51 upsert: true, 52 }, 53 }, 54 { 55 // Delete a document that matches the specified filter 56 deleteOne: { filter: { "location.address.street1": "221b Baker St" } }, 57 }, 58 ]); 59 // Log the result of the bulk write operation 60 console.log(result); 61 } finally { 62 // Close the database connection when the operations are completed or if an error occurs 63 await client.close(); 64 } 65 } 66 run().catch(console.dir);
1 import { MongoClient } from "mongodb"; 2 3 // Replace the uri string with your MongoDB deployment's connection string. 4 const uri = "<connection string uri>"; 5 6 const client = new MongoClient(uri); 7 8 interface Address { 9 street1: string; 10 city: string; 11 state: string; 12 zipcode: string; 13 } 14 15 interface Theater { 16 location: { address: Address }; 17 is_in_ohio?: boolean; 18 } 19 20 async function run() { 21 try { 22 const database = client.db("sample_mflix"); 23 const theaters = database.collection<Theater>("theaters"); 24 25 const result = await theaters.bulkWrite([ 26 { 27 insertOne: { 28 document: { 29 location: { 30 address: { 31 street1: "3 Main St.", 32 city: "Anchorage", 33 state: "AK", 34 zipcode: "99501", 35 }, 36 }, 37 }, 38 }, 39 }, 40 { 41 insertOne: { 42 document: { 43 location: { 44 address: { 45 street1: "75 Penn Plaza", 46 city: "New York", 47 state: "NY", 48 zipcode: "10001", 49 }, 50 }, 51 }, 52 }, 53 }, 54 { 55 updateMany: { 56 // Important: You lose type safety when you use dot notation in queries 57 filter: { "location.address.zipcode": "44011" }, 58 update: { $set: { is_in_ohio: true } }, 59 upsert: true, 60 }, 61 }, 62 { 63 deleteOne: { 64 filter: { "location.address.street1": "221b Baker St" }, 65 }, 66 }, 67 ]); 68 69 console.log(result); 70 } finally { 71 await client.close(); 72 } 73 } 74 run().catch(console.dir);
上記の例を実行すると、次の出力が生成されます。
BulkWriteResult { insertedCount: 2, matchedCount: 1, modifiedCount: 1, deletedCount: 0, upsertedCount: 0, upsertedIds: {}, insertedIds: { '0': new ObjectId("..."), '1': new ObjectId("...") } }