Bulk.execute()
Tip
MongoDB は、一括書込み操作を実行するための db.collection.bulkWrite()
メソッドも提供します。
説明
Bulk.execute()
Bulk()
操作ビルダによって構築された操作リストを実行します。Bulk.execute()
は、次のパラメーターを受け入れます。Parameterタイプ説明writeConcern
ドキュメント任意。 一括操作全体の 書込み保証 ( write concern ) ドキュメントです。 省略すると、デフォルトが使用されます。 スタンドアロンの
mongod
サーバーの場合、書込み保証 (write concern) はデフォルトで{ w: majority }
になります。 レプリカセットの場合、レプリカセット構成の一部として変更されない限り、またはレプリカセットに複数のアービタが含まれている場合は、デフォルトの 書込み保証 (write concern) は{ w: majority }
です。例については、「デフォルトの書込み保証 (write concern) の上書き」を参照してください。
トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。
次の値を返します。 操作のステータスを含む BulkWriteResult()
オブジェクト。実行後は、再初期化せずに
Bulk()
オブジェクトを再実行することはできません。 詳しくは、db.collection.initializeUnorderedBulkOp()
とdb.collection.initializeOrderedBulkOp()
を参照してください。
動作
順序付き操作
ordered
の操作リストを実行するとき、MongoDB は operation type
と連続性によって操作をグループ化します。つまり、同じタイプの連続した操作がグループ化されます。たとえば、順序付きリストに 2 回の挿入操作があり、その後に更新操作、さらに別の挿入操作が続く場合、MongoDB は操作を 3 つのグループに分けます。最初のグループには 2 回の挿入操作、2 番目のグループには更新操作、3 番目のグループには最後の挿入操作が含まれます。この動作は、将来のバージョンで変更される可能性があります。
Bulk()
{ のmongosh
操作とドライバーの同等のメソッドでは、グループ内の操作数に制限はありません。一括操作実行用に操作がどのようにグループ化されているかを確認するには、実行Bulk.getOperations()
後 に呼び出します。
シャーディングされたコレクションで ordered
操作リストを実行すると、通常、 unordered
リストの実行よりも時間がかかります。これは、ordered リストでは毎回の操作で前の操作の完了を待機する必要があるためです。
順序なし操作
unordered
の操作リストを実行するとき、MongoDB は操作をグループ化します。順序なしの一括操作では、リスト内の操作の順序を変更してパフォーマンスを向上させることができます。そのため、アプリケーションは、unordered
一括操作を実行するときに順序に依存すべきではありません。
Bulk()
{ のmongosh
操作とドライバーの同等のメソッドでは、グループ内の操作数に制限はありません。一括操作実行用に操作がどのようにグループ化されているかを確認するには、実行Bulk.getOperations()
後 に呼び出します。
トランザクション
Bulk.insert()
操作の場合、コレクションがすでに存在している必要があります。
Bulk.find.upsert()
の場合、操作の結果がアップサートになる場合は、コレクションがすでに存在している必要があります。
トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。
重要
ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。
トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。
例
一括操作の実行
以下の例では、 items
コレクションでBulk()
操作ビルダを初期化し、一連の挿入操作を追加して操作を実行します。
var bulk = db.items.initializeUnorderedBulkOp(); bulk.insert( { item: "abc123", status: "A", defaultQty: 500, points: 5 } ); bulk.insert( { item: "ijk123", status: "A", defaultQty: 100, points: 10 } ); bulk.execute( );
この操作では、次のBulkWriteResult()
オブジェクトが返されます。
BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 2, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ] })
返されるオブジェクトの詳細については、 BulkWriteResult()
を参照してください。 実行されたバッチの詳細については、 Bulk.getOperations()
を参照してください。
デフォルトの書込み保証 (write concern) の上書き
次のレプリカセットに対する操作では、 wtimeout
を 5,000 ミリ秒とする"w: 1"
の書込み保証( write concern )を指定し、投票権のあるレプリカセット ノードの過半数に書込み (write) が反映された後、または メソッドは 5 秒後にタイムアウトした後にメソッドが返します。
var bulk = db.items.initializeUnorderedBulkOp(); bulk.insert( { item: "efg123", status: "A", defaultQty: 100, points: 0 } ); bulk.insert( { item: "xyz123", status: "A", defaultQty: 100, points: 0 } ); bulk.execute( { w: 1, wtimeout: 5000 } );
この操作では、次のBulkWriteResult()
オブジェクトが返されます。
BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 2, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ] })