Overview
MongoDB、書込み (write) 操作を一括で実行する能力がクライアントに提供されます。MongoDB 8.0 以降では、複数のデータベースとコレクションにわたって一括書き込み操作を実行できます。MongoDB 8.0 より前のバージョンを使用している場合は、単一のコレクションに対して一括書き込み操作を実行できます。
MongoDB8.0 で複数のデータベースとコレクションにわたって一括書き込み操作を実行するには、bulkWrite データベースコマンドまたはMongo.bulkWrite()mongosh メソッドを使用します。
単一のコレクションに対して一括書き込み操作を実行するには、db.collection.bulkWrite() mongosh メソッドを使用します。MongoDB 8.0 以降を実行中いる場合は、bulkWrite または Mongo.bulkWrite() を使用して 1 つのコレクションに書き込むこともできます。
順序付き操作と順序なし操作
一括書き込み操作は、連続して( 順序付き )または任意の順序( 順序なし )で実行されます。デフォルトでは 、操作は順序付けられ、最初のエラーで停止します。順序なし操作はエラーがあっても続行され、並行して実行される可能性があるため、シャーディングされたコレクションでは通常高速です。
実行動作とエラー処理の詳細については、db.collection.bulkWrite() またはMongo.bulkWrite() を参照してください。
サポートされている操作
一括書き込み操作のサポート: 1 つの挿入、1 つの更新、多数の更新、1 つの置換、1 つの削除、複数の削除
シャーディングされたコレクションへの一括挿入に関する戦略
大規模な一括挿入操作は、シャーディングされたクラスターのパフォーマンスに影響可能性があります。シャーディングされたコレクションでの一括書込みを最適化するには:
コレクションの事前分割
シャーディングされたコレクションが空で、シャードキーの最初のキーにハッシュされたシャーディングを使用していない場合、コレクションには最初のチャンクが 1 つだけあり、そのチャンクは 1 つのシャード上にあります。MongoDB は、データを受信し、利用可能なシャードにチャンクを分配するために時間を必要とします。このパフォーマンスコストを回避するには、シャーディングされたクラスターで範囲を作成して、コレクションを事前に分割します。
への順序なしの書き込み mongos
orderedfalseシャーディングされたクラスターへの書込みパフォーマンスを向上させるには、一括書き込みを実行するときに、 を に設定して、順序なしの一括書き込みを実行します。mongos は、複数のシャードに書き込みを同時に送信しようとします。空の コレクションの場合はまず、 「 シャードクラスタでのチャンクの分割 」で説明されているように、コレクションを事前に分割します。
単調なスロットリングを避ける
挿入中にシャードキーが単調に増加した場合、挿入されたすべてのデータはコレクションの最後のチャンクに送られ、最終的には常に 1 つのシャードになります。したがって、クラスターの挿入キャパシティーが、その 1 つのシャードの挿入キャパシティーを超えることはありません。
挿入量が単一のシャードで処理できる量よりも大きく、シャードキーの単調な増加が避けられない場合は、アプリケーションに対する次の変更を検討してください。
シャードキーのバイナリ ビットを逆にします。これによって情報が保持され、挿入の順序と値の増加順序との相関が回避されます。
インサートを「シャッフル」するには、最初と最後の 16 ビット ワードを入れ替えます。
例
C++ を使用した次の例では、生成されたBSON ObjectIdの先頭と末尾の 16 ビット ワードを入れ替えて、単調に増加しないようにします。
using namespace mongo; OID make_an_id() { OID x = OID::gen(); const unsigned char *p = x.getData(); swap( (unsigned short&) p[0], (unsigned short&) p[10] ); return x; } void foo() { // create an object BSONObj o = BSON( "_id" << make_an_id() << "x" << 3 << "name" << "jane" ); // now we may insert o into a sharded collection }