Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

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() に呼び出します。

Tip

以下も参照してください。

シャーディングされたコレクションで ordered 操作リストを実行すると、通常、 unordered リストの実行よりも時間がかかります。これは、ordered リストでは毎回の操作で前の操作の完了を待機する必要があるためです。

unordered の操作リストを実行するとき、MongoDB は操作をグループ化します。順序なしの一括操作では、リスト内の操作の順序を変更してパフォーマンスを向上させることができます。そのため、アプリケーションは、unordered 一括操作を実行するときに順序に依存すべきではありません。

Bulk(){ のmongosh 操作とドライバーの同等のメソッドでは、グループ内の操作数に制限はありません。一括操作実行用に操作がどのようにグループ化されているかを確認するには、実行Bulk.getOperations() に呼び出します。

Tip

以下も参照してください。

Bulk()分散トランザクション 内で使用できます。

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()を参照してください。

次のレプリカセットに対する操作では、 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" : [ ]
})

Tip

次を参照してください。

Bulk() 一括操作で使用できるメソッドのリストについては、 を参照してください。

戻る

一括

項目一覧