Overview
このガイドでは、 Rubyドライバーを使用して、1 回のデータベース呼び出しでデータに複数の変更を加える一括書き込み操作を実行する方法を学習できます。
同じタスクでドキュメントの挿入、ドキュメントの更新、ドキュメントの削除が必要になる状況を考えてみましょう。個々の書込みメソッドを使用する場合、各書込み操作はデータベースに個別にアクセスします。代わりに、アプリケーションがサーバーに行う呼び出しの数を最適化するために、 一括書込み (write)操作を使用できます。
サンプル データ
このガイドの例では、Atlasサンプルデータセット の sample_restaurantsデータベースの restaurantsコレクションを使用します。Rubyアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続する Mongo::Clientオブジェクトを作成し、次の値を database 変数と collection 変数に割り当てます。
database = client.use('sample_restaurants') collection = database[:restaurants]
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、MongoDBを使い始めるガイドを参照してください。
書込み (write) 操作を定義する
実行する書込み操作ごとに、次のいずれかの操作を実装するハッシュを作成します。
insert_oneupdate_oneupdate_manyreplace_onedelete_onedelete_many
次に、これらのインスタンスのリストをbulk_writeメソッドに渡します。
次のセクションでは、前述の操作のインスタンスを作成して使用する方法を示します。「 一括操作の実行 」セクションでは、ハッシュのリストを bulk_write メソッドに渡して 一括操作を実行する方法が説明されています。
挿入操作
挿入操作を実行するには、insert_one ハッシュを作成し、挿入するドキュメントを指定します。
次の例では、insert_one ハッシュを作成しています。
insert_one = { insert_one: { name: 'Steve Rogers Cafe', borough: 'Brooklyn' } }
複数のドキュメントを挿入するには、ドキュメントごとに個別の insert_one ハッシュを作成します。
重要
一括操作を実行する場合、insert_one操作は、コレクションにすでに存在する _id を含むドキュメントを挿入できません。この状況では、ドライバーは MongoBulkWriteException をスローします。
アップデート操作
ドキュメントを更新するには、update_one ハッシュを作成し、次の引数を渡します。
コレクション内のドキュメントをマッチングするために使用される基準を指定するクエリフィルター。
update_one操作は、クエリフィルターに一致する最初のドキュメントの更新を指定します。
次の例では、update_one ハッシュを作成しています。
update_one = { update_one: { filter: { name: 'Mountain View' }, update: { '$set': { borough: 'Queens' } } } }
複数のドキュメントを更新するには、update_many ハッシュを作成し、update_one操作の と同じ引数を渡します。update_many操作は、クエリフィルターに一致するすべてのドキュメントのアップデートを指定します。
次の例では、update_many ハッシュを作成しています。
update_many = { update_many: { filter: { name: 'Starbucks' }, update: { '$set': { cuisine: 'Cafe' } } } }
置換操作
置換操作、指定されたドキュメントのすべてのフィールドと値が削除され、指定した新しいフィールドと値に置き換えられます。置換操作を実行するには、replace_one ハッシュを作成し、次の引数を渡します。
コレクション内のドキュメントをマッチングするために使用される基準を指定するクエリフィルター
挿入する新しいフィールドと値を指定する置換ドキュメント
次の例では、replace_one ハッシュを作成しています。
replace_one = { replace_one: { filter: { name: 'Old World Diner' }, replacement: { '$set': { name: 'New Age Luncheonette' } } } }
複数のドキュメントを置き換えるには、ドキュメントごとに replace_one ハッシュを作成する必要があります。
削除操作
ドキュメントを削除するには、delete_one ハッシュを作成し、削除するドキュメントを指定するクエリフィルターを渡します。delete_one操作は、クエリフィルターに一致する最初のドキュメントのみを削除します。
次の例では、delete_one ハッシュを作成しています。
delete_one = { delete_one: { name: 'Old World Diner' } }
複数のドキュメントを削除するには、delete_many ハッシュを作成し、削除するドキュメントを指定するクエリフィルターを渡します。delete_many操作は、 クエリフィルターに一致するすべてのドキュメントを削除します。
次の例では、delete_many ハッシュを作成しています。
delete_many = { delete_many: { name: 'Starbucks' } }
一括操作の実行
実行する操作ごとにハッシュを定義したら、これらのオブジェクトのリストを bulk_write メソッドに渡します。デフォルトでは 、メソッドはハッシュのリストで指定された順序で操作を実行します。
次の例では、 bulk_writeメソッドを使用して複数の書込み操作を実行します。
insert_one = { insert_one: { name: 'Nuovo Ristorante', borough: 'Brooklyn', cuisine: 'Italian' } } update_one = { update_one: { filter: { name: 'Moonlit Tavern' }, update: { '$set': { borough: 'Queens' } } } } delete_many = { delete_many: { name: 'Crepe' } } writes = [insert_one, update_one, delete_many] collection.bulk_write(writes)
いずれかの書込み操作が失敗した場合、 Rubyドライバーは BulkWriteError を発生させ、それ以上の操作を実行しません。BulkWriteError は、失敗した操作と例外に関する詳細を含む details アイテムを提供します。
注意
ドライバーが一括操作を実行する場合、ターゲット コレクションの書込み保証 (write concern) が使用されます。 ドライバーは、実行順序に関係なく、すべての操作を試行した後にすべての書込み保証 (write concern) エラーを報告します。
一括書き込み操作をカスタマイズする
bulk_write メソッドはオプションで、 一括書込み操作を構成するために使用できるオプションを指定する options ハッシュを受け入れます。オプションを指定しない場合、ドライバーはデフォルト設定で一括操作を実行します。
次の表では、bulk_write メソッドを構成するために使用できるオプションについて説明しています。
オプション | 説明 |
|---|---|
|
|
| アップデート操作がドキュメント検証をバイパスするかどうかを指定します。これにより、スキーマ検証要件を満たさないドキュメントを更新することができます(存在する場合)。スキーマ検証の詳細については、 MongoDB Serverマニュアルの「 スキーマバリデーション 」を参照してください。デフォルトは |
|
|
| 操作の最上位変数を設定するためのパラメーター名と値のマップを提供します。値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。 |
次のコードでは、オプションを作成し、ordered オプションを false に設定して、順序なしの一括書き込みを指定します。次に、コードは bulk_write メソッドを使用して、前の例と同じ一括操作を実行します。
options = { ordered: false } collection.bulk_write(writes, options)
順序付けなし一括書き込み 内のいずれかの書き込み操作が失敗した場合、 Rubyドライバーはすべての操作を試行した後にのみエラーを報告します。
注意
順序なしの一括操作では、実行順序は保証されません。 この順序は、ランタイムを最適化するために一覧表示する方法とは異なる場合があります。
戻り値
bulk_write メソッドからは BulkWrite::Result が返されます。次のインスタンスメソッドを使用して、Resultインスタンスからの情報にアクセスできます。
方式 | 説明 |
|---|---|
| サーバーが書込み (write) 操作を確認したかどうかを示します。 |
| 削除されたドキュメントの数を返します(存在する場合)。 |
| 挿入されたドキュメントの数を返します(存在する場合)。 |
| 挿入されたドキュメントID のリスト(存在する場合)を返します。 |
| 該当する場合は、アップデートに一致したドキュメントの数を返します。 |
| 変更されたドキュメントの数を返します(存在する場合)。 |
| アップサートされたドキュメントの数を返します(存在する場合)。 |
| アップサートされたドキュメントID のリスト(存在する場合)を返します。 |
詳細情報
個々の書込み操作を実行する方法については、次のガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。