一括書込み (write)
一括書き込み API は、1 つのコマンドでサーバーに複数の書き込み操作を送信します。 複数の書き込みを一度に実行する際に、ネットワーク ラウンド トリップの回数を減らすには、 一括書き込み API を使用します。 たとえば、複数の更新を効率的に実行するには、次の操作を実行します。
collection = client['colors'] collection.bulk_write([ { update_one: { filter: {name: 'yellow'}, update: {'$set' => {hex: 'ffff00'}}, }, }, { update_one: { filter: {name: 'purple'}, update: {'$set' => {hex: '800080'}}, }, }, ], ordered: true, write_concern: {w: :majority})
次の例は、同じリクエストで異なるタイプの操作を実行する方法を示しています。
collection.bulk_write([ { insert_one: { x: 1 } }, { update_one: { filter: { x: 1 }, update: {'$set' => { x: 2 } }, } }, { replace_one: { filter: { x: 2 }, replacement: { x: 3 }, } }, ], :ordered => true)
bulk_write
の最初の引数は、実行する操作のリストです。 各操作は、操作名と操作仕様のキーを対応する値として 1 つだけ含むハッシュとして指定する必要があります。 サポートされている操作の詳細を以下に示します。 bulk_write
メソッドは次のオプションも受け入れます。
オプション | 説明 |
---|---|
bypass_document_validation | true またはfalse 。 ドキュメント検証をバイパスするかどうか。 |
ordered | ordered オプションがtrue (デフォルト)に設定されている場合、操作は順番に適用され、いずれかの操作が失敗した場合は、後続の操作は試行されません。 ordered オプションがfalse に設定されている場合、指定されたすべての操作が試行されます。 |
write_concern | 操作の 書込み保証 (write concern) 。ハッシュとして指定されます。 |
有効な一括書込み操作は次のとおりです。
insert_one
{ insert_one: { x: 1 } }
注意
insert_many
一括操作はありません。 複数のドキュメントを挿入するには、複数のinsert_one
操作を指定します。
update_one
{ update_one: { filter: { x: 1 }, update: { '$set' => { x: 2 } }, # upsert is optional and defaults to false upsert: true, } }
update_many
{ update_many: { filter: { x: 1 }, update: { '$set' => { x: 2 } }, # upsert is optional and defaults to false :upsert => true, } }
replace_one
{ replace_one: { filter: { x: 1 }, replacement: { x: 2 }, # upsert is optional and defaults to false upsert: true, } }
注意
:replace_one
操作では、置き換え値がドキュメントである必要があります。 :replace_one
は、置換値内の MongoDB 更新演算子を認識しません。 将来のリリースでは、ドライバーは置換ドキュメントで$
で始まるキーの使用を禁止する予定です。
delete_one
{ delete_one: { filter: { x: 1 }, } }
delete_many
{ delete_many: { filter: { x: 1 }, } }
一括書込み (write) の分割
ドライバーを使用すると、アプリケーションは任意の大きな一括書込みリクエストを送信できます。 ただし、MongoDB サーバーはコマンド ドキュメントのサイズを制限しているため(現在、この制限は 48 MiB です)、この制限を超える一括書込みは複数のリクエストに分割されます。
クライアント側暗号化を使用すると、一括書き込み分割に使用されるしきい値が小さくされ、暗号テキストのオーバーヘッドが可能になります。