Overview
このガイドでは、 Node.jsドライバーを使用して 一括操作 を実行する方法を学習できます。一括操作は、サーバーへの呼び出しの回数を減らすのに役立ちます。各操作のリクエストを送信する代わりに、1 つのアクション内で複数の操作を実行できます。
一括操作 を使用して、コレクションに対して複数の書込み (write) 操作を実行できます。クライアントから一括操作を実行することもできます。これにより、複数の名前空間にわたって一括書込みを実行できます。MongoDBでは、名前空間は<database>.<collection>形式のデータベース名とコレクション名で構成されています。
注意
ドライバーが処理できる書込み操作の量に制限はありません。ドライバーは maxWriteBatchSize に従ってデータをバッチにグループ化します。これは 100、000 であり、変更できません。バッチに 100,000 を超える操作が含まれている場合、ドライバーはバッチを maxWriteBatchSize 以下の小さなグループに分割します。例、操作に 250,000 操作が含まれている場合、ドライバーは 3 つのバッチを作成します。2 つは 100,000 操作で、1 つは 50,000 操作です。
このガイドには、次のセクションが含まれています。
一括挿入操作 では、コレクションまたはクライアントに対して 一括挿入操作 を実行する方法について説明します。
一括置換操作 では、コレクションまたはクライアントに対して一括置換操作を実行する方法について説明します。
一括更新操作 では、コレクションまたはクライアントに対して一括更新操作を実行する方法について説明します。
一括削除操作 では、コレクションまたはクライアントに対して一括削除操作を実行する方法について説明します。
例外の処理 では、一括書込み操作のいずれかの操作が失敗した場合に発生する例外について説明します。
追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します。
重要
サーバーとドライバーのバージョンの要件
コレクション レベルの一括書き込み操作には、次のバージョンが必要です。
MongoDB Serverバージョン 3.2 以降
Node.jsドライバー バージョン 3.6 以降
クライアントレベルの一括書き込み操作には、次のバージョンが必要です。
MongoDB Serverバージョン 8.0 以降
Node.jsドライバー バージョン 6.10 以降
サンプル データ
このガイドの例では、Atlasサンプルデータセットに含まれる sample_mflixデータベース内の movies コレクションと users コレクションを使用します。MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、MongoDBを使い始めるガイドを参照してください。
一括挿入操作
一括挿入操作を実行するには、挿入するドキュメントごとに 一括操作モデル を作成します。次に、これらのモデルのリストを bulkWrite() メソッドに渡します。
このセクションでは、次のタイプの一括操作を実行する方法について説明します。
コレクションの一括挿入
コレクションに対して 一括挿入操作 を実行するには、 各操作に対して InsertOneModel を作成します。次に、コレクションで bulkWrite() メソッドを呼び出し、モデルの配列をパラメーターとして渡します。InsertOneModel を作成するには、モデルの documentフィールドを指定し、挿入するドキュメントに設定します。
例
この例では、次のアクションを実行します。
配列内の 2 つの
InsertOneModelインスタンスを指定します。各InsertOneModelは、sample_mflixデータベース内のmoviesコレクションに挿入するドキュメントを表します。moviesコレクションでbulkWrite()メソッドを呼び出し、モデルの配列をパラメーターとして渡します。挿入されたドキュメントの数を出力します。
const insertModels = [{ insertOne: { document: { title: "The Favourite", year: 2018, rated: "R", released: "2018-12-21" } }}, { insertOne: { document: { title: "I, Tonya", year: 2017, rated: "R", released: "2017-12-08" } }}];
const insertResult = await movies.bulkWrite(insertModels);console.log(`Inserted documents: ${insertResult.insertedCount}`);クライアント一括挿入
複数のコレクションまたはデータベースにわたって一括挿入操作を実行するには、 各操作に対して ClientBulkWriteModel を作成します。次に、クライアントで bulkWrite() メソッドを呼び出し、モデルの配列をパラメーターとして渡します。
次の表では、挿入操作を指定するために ClientBulkWriteModel に設定できるフィールドについて説明しています。
フィールド | 説明 |
|---|---|
| ドキュメントを挿入する名前空間。 |
| 実行する操作。挿入操作の場合は、このフィールドを |
| 挿入するドキュメント。 |
例
この例では、次のアクションを実行します。
配列内の 3 つの
ClientBulkWriteModelインスタンスを指定します。最初の 2 つのモデルはmoviesコレクションに挿入するドキュメントを表し、最後のモデルはusersコレクションに挿入するドキュメントを表します。クライアントで
bulkWrite()メソッドを呼び出し、モデルの配列をパラメーターとして渡します。挿入されたドキュメントの数を出力します。
const clientInserts = [{ namespace: "sample_mflix.movies", name: "insertOne", document: { title: "The Favourite", year: 2018, rated: "R", released: "2018-12-21" }}, { namespace: "sample_mflix.movies", name: "insertOne", document: { title: "I, Tonya", year: 2017, rated: "R", released: "2017-12-08" }}, { namespace: "sample_mflix.users", name: "insertOne", document: { name: "Brian Schwartz", email: "bschwartz@example.com" }}];
const clientInsertRes = await client.bulkWrite(clientInserts);console.log(`Inserted documents: ${clientInsertRes.insertedCount}`);一括置換操作
一括置換操作を実行するには、置き換えるドキュメントごとに 一括操作モデル を作成します。次に、これらのモデルのリストを bulkWrite() メソッドに渡します。
このセクションでは、次のタイプの一括操作を実行する方法について説明します。
コレクションの一括置換
コレクションに対して 一括置換操作を実行するには、 各操作に対して ReplaceOneModel を作成します。次に、コレクションで bulkWrite() メソッドを呼び出し、モデルの配列をパラメーターとして渡します。
次の表では、ReplaceOneModel で設定できるフィールドについて説明しています。
フィールド | 説明 |
|---|---|
| 置き換えるドキュメントに一致するフィルター。 |
| 置換ドキュメントです。 |
| (任意)結果をソートするときに使用する照合。照合の詳細については、「 CRUD操作の構成 」ガイドの「 照合 」セクションを参照してください。 |
| (任意)操作に使用するインデックス。インデックスの詳細については、クエリ最適化のインデックスガイド を参照してください。 |
| (任意) フィルター に一致するドキュメントがない場合に新しいドキュメントを作成するかどうか。 |
例
この例では、次のアクションを実行します。
配列内の 2 つの
ReplaceOneModelインスタンスを指定します。ReplaceOneModelインスタンスには、moviesコレクション内の映画を表すドキュメントを置き換えるための指示が含まれています。moviesコレクションでbulkWrite()メソッドを呼び出し、モデルの配列をパラメーターとして渡します。変更されたドキュメントの数を出力します。
const replaceOperations = [{ replaceOne: { filter: { title: "The Dark Knight" }, replacement: { title: "The Dark Knight Rises", year: 2012, rating: "PG-13" }, upsert: false }}, { replaceOne: { filter: { title: "Inception" }, replacement: { title: "Inception Reloaded", year: 2010, rating: "PG-13" }, upsert: false }}];
const replaceResult = await movies.bulkWrite(replaceOperations);console.log(`Modified documents: ${replaceResult.modifiedCount}`);クライアントの一括置換
複数のコレクションまたはデータベースにわたって一括置換操作を実行するには、 各操作に対して ClientBulkWriteModel を作成します。次に、クライアントで bulkWrite() メソッドを呼び出し、モデルの配列をパラメーターとして渡します。
次の表では、置換操作を指定するために ClientBulkWriteModel に設定できるフィールドについて説明しています。
フィールド | 説明 |
|---|---|
| ドキュメントを置き換える名前空間空間。 |
| 実行する操作。置換操作の場合は、このフィールドを |
| 置き換えるドキュメントに一致するフィルター。 |
| 置換ドキュメントです。 |
| (任意)結果をソートするときに使用する照合。照合の詳細については、「 CRUD操作の構成 」ガイドの「 照合 」セクションを参照してください。 |
| (任意)操作に使用するインデックス。インデックスの詳細については、クエリ最適化のインデックスガイド を参照してください。 |
例
この例では、次のアクションを実行します。
配列内の 3 つの
ClientBulkWriteModelインスタンスを指定します。最初の 2 つのモデルにはmoviesコレクション内のドキュメントの置換手順が含まれ、最後のモデルにはusersコレクション内のドキュメントの置換手順が含まれています。クライアントで
bulkWrite()メソッドを呼び出し、モデルの配列をパラメーターとして渡します。変更されたドキュメントの数を出力します。
const clientReplacements = [{ namespace: "sample_mflix.movies", name: "replaceOne", filter: { title: "The Dark Knight" }, replacement: { title: "The Dark Knight Rises", year: 2012, rating: "PG-13" }}, { namespace: "sample_mflix.movies", name: "replaceOne", filter: { title: "Inception" }, replacement: { title: "Inception Reloaded", year: 2010, rating: "PG-13" }}, { namespace: "sample_mflix.users", name: "replaceOne", filter: { name: "April Cole" }, replacement: { name: "April Franklin", email: "aprilfrank@example.com" }}];
const clientReplaceRes = await client.bulkWrite(clientReplacements);console.log(`Modified documents: ${clientReplaceRes.modifiedCount}`);一括更新操作
一括更新操作を実行するには、実行する更新ごとに 一括操作モデル を作成します。次に、これらのモデルのリストを bulkWrite() メソッドに渡します。
このセクションでは、次のタイプの一括操作を実行する方法について説明します。
コレクションの一括更新
コレクションに対して 一括更新操作 を実行するには、 各操作に対して UpdateOneModel または UpdateManyModel を作成します。次に、コレクションで bulkWrite() メソッドを呼び出し、モデルの配列をパラメーターとして渡します。UpdateOneModel はフィルターに一致するドキュメントを1 つだけ更新し、UpdateManyModel はフィルターに一致するすべてのドキュメントを更新します。
次の表では、UpdateOneModel または UpdateManyModel で設定できるフィールドについて説明しています。
フィールド | 説明 |
|---|---|
| 更新する 1 つ以上のドキュメントに一致するフィルター。 |
| 実行される更新。 |
| (任意) 配列値フィールドを更新する場合に更新を適用する配列要素を指定するフィルターのセット。 |
| (任意)結果をソートするときに使用する照合。照合の詳細については、「 CRUD操作の構成 」ガイドの「 照合 」セクションを参照してください。 |
| (任意)操作に使用するインデックス。インデックスの詳細については、クエリ最適化のインデックスガイド を参照してください。 |
| (任意) フィルター に一致するドキュメントがない場合に新しいドキュメントを作成するかどうか。デフォルトでは、このフィールドは |
例
この例では、次のアクションを実行します。
配列で
UpdateOneModelインスタンスとUpdateManyModelインスタンスを指定します。 これらのモデルには、moviesコレクション内の映画を表すドキュメントを更新するための指示が含まれています。moviesコレクションでbulkWrite()メソッドを呼び出し、モデルの配列をパラメーターとして渡します。変更されたドキュメントの数を出力します。
const updateOperations = [{ updateOne: { filter: { title: "Interstellar" }, update: { $set: { title: "Interstellar Updated", genre: "Sci-Fi Adventure" } }, upsert: true }}, { updateMany: { filter: { rated: "PG-13" }, update: { $set: { rated: "PG-13 Updated", genre: "Updated Genre" } } }}];
const updateResult = await movies.bulkWrite(updateOperations);console.log(`Modified documents: ${updateResult.modifiedCount}`);クライアントの一括更新
複数のコレクションまたはデータベースにわたって一括更新操作を実行するには、 各操作に対して ClientBulkWriteModel を作成します。次に、クライアントで bulkWrite() メソッドを呼び出し、モデルの配列をパラメーターとして渡します。
次の表では、 更新操作を指定するために ClientBulkWriteModel に設定できるフィールドについて説明しています。
フィールド | 説明 |
|---|---|
| ドキュメントを更新する名前空間。 |
| 実行する操作。更新操作では、このフィールドを |
| 更新する 1 つ以上のドキュメントに一致するフィルター。モデル |
| 実行される更新。 |
| (任意) 配列値フィールドを更新する場合に更新を適用する配列要素を指定するフィルターのセット。 |
| (任意)結果をソートするときに使用する照合。照合の詳細については、「 CRUD操作の構成 」ガイドの「 照合 」セクションを参照してください。 |
| (任意)操作に使用するインデックス。インデックスの詳細については、クエリ最適化のインデックスガイド を参照してください。 |
| (任意) フィルター に一致するドキュメントがない場合に新しいドキュメントを作成するかどうか。デフォルトでは、このフィールドは |
例
この例では、次のアクションを実行します。
配列内の 2 つの
ClientBulkWriteModelインスタンスを指定します。最初のモデルはmoviesコレクションの更新操作数を指定し、2 番目のモデルはusersコレクションの更新 1 つの操作を指定します。クライアントで
bulkWrite()メソッドを呼び出し、モデルの配列をパラメーターとして渡します。変更されたドキュメントの数を出力します。
const clientUpdates = [{ namespace: "sample_mflix.movies", name: "updateMany", filter: { rated: "PG-13" }, update: { $set: { rated: "PG-13 Updated", genre: "Updated Genre" } }, upsert: false}, { namespace: "sample_mflix.users", name: "updateOne", filter: { name: "Jon Snow" }, update: { $set: { name: "Aegon Targaryen", email: "targaryen@example.com" } }, upsert: false}];const clientUpdateRes = await client.bulkWrite(clientUpdates);console.log(`Modified documents: ${clientUpdateRes.modifiedCount}`);一括削除操作
一括削除操作を実行するには、削除操作ごとに 一括操作モデル を作成します。次に、これらのモデルのリストを bulkWrite() メソッドに渡します。
このセクションでは、次のタイプの一括操作を実行する方法について説明します。
コレクションの一括削除
コレクションに対して一括削除操作を実行するには、 各操作に対して DeleteOneModel または DeleteManyModel を作成します。次に、コレクションで bulkWrite() メソッドを呼び出し、モデルの配列をパラメーターとして渡します。DeleteOneModel はフィルターに一致するドキュメントを1 つだけ削除し、DeleteManyModel はフィルターに一致するすべてのドキュメントを削除します。
次の表では、DeleteOneModel または DeleteManyModel で設定できるフィールドについて説明しています。
フィールド | 説明 |
|---|---|
| 削除したい 1 つ以上のドキュメントに一致するフィルター。 |
| (任意)結果をソートするときに使用する照合。照合の詳細については、「 CRUD操作の構成 」ガイドの「 照合 」セクションを参照してください。 |
| (任意)操作に使用するインデックス。インデックスの詳細については、クエリ最適化のインデックスガイド を参照してください。 |
例
この例では、次のアクションを実行します。
配列で
DeleteOneModelインスタンスとDeleteManyModelインスタンスを指定します。これらのモデルには、moviesコレクション内のドキュメントを削除するための手順が含まれています。moviesコレクションでbulkWrite()メソッドを呼び出し、モデルの配列をパラメーターとして渡します。削除されたドキュメントの数を出力します。
const deleteOperations = [{ deleteOne: { filter: { title: "Dunkirk" } }}, { deleteMany: { filter: { rated: "R" } }}];
const deleteResult = await movies.bulkWrite(deleteOperations);console.log(`Deleted documents: ${deleteResult.deletedCount}`);クライアントの一括削除
複数のコレクションまたはデータベースにわたって一括削除操作を実行するには、 各操作に対して ClientBulkWriteModel を作成します。次に、クライアントで bulkWrite() メソッドを呼び出し、モデルの配列をパラメーターとして渡します。
次の表では、削除操作を指定するために ClientBulkWriteModel に設定できるフィールドについて説明しています。
フィールド | 説明 |
|---|---|
| ドキュメントを削除する名前空間空間。 |
| 実行する操作。削除操作の場合は、このフィールドを |
| 削除したい 1 つ以上のドキュメントに一致するフィルター。モデル |
| (任意)操作に使用するインデックス。インデックスの詳細については、クエリ最適化のインデックスガイド を参照してください。 |
| (任意)結果をソートするときに使用する照合。照合の詳細については、「 CRUD操作の構成 」ガイドの「 照合 」セクションを参照してください。 |
例
この例では、次のアクションを実行します。
配列内の 2 つの
ClientBulkWriteModelインスタンスを指定します。最初のモデルはmoviesコレクションに対して多数の削除操作を指定し、2 番目のモデルはusersコレクションに対して 1 つの削除操作を指定します。クライアントで
bulkWrite()メソッドを呼び出し、モデルの配列をパラメーターとして渡します。変更されたドキュメントの数を出力します。
const clientDeletes = [{ namespace: "sample_mflix.movies", name: "deleteMany", filter: { rated: "R" }}, { namespace: "sample_mflix.users", name: "deleteOne", filter: { email: "emilia_clarke@gameofthron.es" }}];
const clientDeleteRes = await client.bulkWrite(clientDeletes);console.log(`Deleted documents: ${clientDeleteRes.deletedCount}`);戻り値の型
BulkWriteResult
Collection.bulkWrite() メソッドは BulkWriteResultオブジェクトを返します。これは 一括操作に関する情報を提供します。
次の表は、BulkWriteResultオブジェクトのフィールドを説明します。
フィールド | 説明 |
|---|---|
| 挿入されたドキュメントの数 |
| 一致したドキュメントの数 |
| 更新されたドキュメントの数 |
| アップサートされた文書の数 |
| 削除されたドキュメントの数 |
ClientBulkWriteResult
MongoClient.bulkWrite() メソッドは、クライアントの一括書込み操作に関する情報を含む ClientBulkWriteResultオブジェクトを返します。
次の表は、ClientBulkWriteResultオブジェクトのフィールドを説明します。
フィールド | 説明 |
|---|---|
| 一括書き込みが確認されたかどうかを示すブール値値 |
| 挿入されたドキュメントの数 |
| 一致したドキュメントの数 |
| 更新されたドキュメントの数 |
| アップサートされた文書の数 |
| 削除されたドキュメントの数 |
| 成功した各挿入操作の結果 |
| 成功した各更新操作の結果 |
| 成功した各削除操作の結果 |
例外の処理
コレクションの一括書込みの例外
コレクションで呼び出された一括書き込み操作が失敗した場合、ordered オプションが true に設定されている場合、 Node.jsドライバーは MongoBulkWriteError をスローし、それ以上の操作を実行しません。ordered が false に設定されている場合、後続の操作への続行が試行されます。
MongoBulkWriteErrorオブジェクトには次のプロパティが含まれています。
プロパティ | 説明 |
|---|---|
| エラーメッセージ。 |
| 一括書き込み操作中に発生したエラーの配列。 |
| 一括書き込み操作の実行中に発生した書込み保証 (write concern) エラーです。 |
| 例外がスローされる前に実行された成功した操作の結果。 |
| 基礎のエラーオブジェクト。これには詳細が含まれる場合があります。 |
クライアント一括書込みの例外
クライアントで呼び出される一括書き込み操作が失敗した場合、 Node.jsドライバーは MongoClientBulkWriteError を生成します。デフォルトでは 、ドライバーはエラーが発生すると後続の操作を実行しません。ordered オプションを bulkWrite() メソッドに渡し、それを false に設定すると、ドライバーは残りの操作を引き続き試行します。
MongoClientBulkWriteErrorオブジェクトには次のプロパティが含まれています。
プロパティ | 説明 |
|---|---|
| 各書込み保証 (write concern)エラーを指定するドキュメントの配列。 |
| 個々の書き込み (write) 操作中に発生したエラーのマップ。 |
| エラー前の操作の進行状況を反映したクライアント一括書込みの部分的な結果。 |
bulkWrite() の例: 完全なファイル
注意
セットアップ例
この例では、接続 URI を使用して MongoDB インスタンスに接続します。MongoDB インスタンスへの接続の詳細については、「MongoDB への接続」ガイドを参照してください。この例では、Atlas サンプル データセットに含まれる sample_mflix データベースの movies コレクションも使用します。MongoDB Get Startedに従って、MongoDB Atlasの無料クラスター上のデータベースに読み込むことができます。
次のコードは、sample_mflixデータベース内の theatersコレクションに対して一括書き込み操作を実行する完全なスタンドアロンファイルです。operations パラメータには、insertOne、updateMany、deleteOne の書き込み操作の例が含まれています。
// Bulk write operation
// Import MongoClient from the MongoDB node driver packageconst { MongoClient } = require("mongodb");
// Replace the uri string with your MongoDB deployment's connection stringconst uri = "<connection string uri>";
const client = new MongoClient(uri);
async function run() { try { const database = client.db("sample_mflix"); const theaters = database.collection("theaters");
// Insert a new document into the "theaters" collection const result = await theaters.bulkWrite([ { insertOne: { document: { location: { address: { street1: "3 Main St.", city: "Anchorage", state: "AK", zipcode: "99501", }, }, }, }, }, { insertOne: { document: { location: { address: { street1: "75 Penn Plaza", city: "New York", state: "NY", zipcode: "10001", }, }, }, }, }, { // Update documents that match the specified filter updateMany: { filter: { "location.address.zipcode": "44011" }, update: { $set: { is_in_ohio: true } }, upsert: true, }, }, { // Delete a document that matches the specified filter deleteOne: { filter: { "location.address.street1": "221b Baker St" } }, }, ]); // Log the result of the bulk write operation console.log(result); } finally { // Close the database connection when the operations are completed or if an error occurs await client.close(); }}run().catch(console.dir);import { MongoClient } from "mongodb";
// Replace the uri string with your MongoDB deployment's connection string.const uri = "<connection string uri>";
const client = new MongoClient(uri);
interface Address { street1: string; city: string; state: string; zipcode: string;}
interface Theater { location: { address: Address }; is_in_ohio?: boolean;}
async function run() { try { const database = client.db("sample_mflix"); const theaters = database.collection<Theater>("theaters");
const result = await theaters.bulkWrite([ { insertOne: { document: { location: { address: { street1: "3 Main St.", city: "Anchorage", state: "AK", zipcode: "99501", }, }, }, }, }, { insertOne: { document: { location: { address: { street1: "75 Penn Plaza", city: "New York", state: "NY", zipcode: "10001", }, }, }, }, }, { updateMany: { // Important: You lose type safety when you use dot notation in queries filter: { "location.address.zipcode": "44011" }, update: { $set: { is_in_ohio: true } }, upsert: true, }, }, { deleteOne: { filter: { "location.address.street1": "221b Baker St" }, }, }, ]);
console.log(result); } finally { await client.close(); }}run().catch(console.dir);上記の例を実行すると、次の出力が生成されます。
BulkWriteResult { insertedCount: 2, matchedCount: 1, modifiedCount: 1, deletedCount: 0, upsertedCount: 0, upsertedIds: {}, insertedIds: { '0': new ObjectId("..."), '1': new ObjectId("...") }}詳細情報
一括操作の詳細については、 MongoDB Serverマニュアルの「 一括書込み 」を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。