Docs Menu
Docs Home
/ / /
Ruby ドライバー
/

一括書き込み操作

このガイドでは、 Rubyドライバーを使用して、1 回のデータベース呼び出しでデータに複数の変更を加える一括書き込み操作を実行する方法を学習できます。

同じタスクでドキュメントの挿入、ドキュメントの更新、ドキュメントの削除が必要になる状況を考えてみましょう。個々の書込みメソッドを使用する場合、各書込み操作はデータベースに個別にアクセスします。代わりに、アプリケーションがサーバーに行う呼び出しの数を最適化するために、 一括書込み (write)操作を使用できます。

このガイドの例では、 Atlasサンプルデータセット restaurantssample_restaurantsの データベース内の コレクションを使用します。 Rubyアプリケーションからこのコレクションにアクセスするには、AtlasMongo::Client クラスターに接続する オブジェクトを作成し、次の値を 変数と 変数に割り当てます。databasecollection

database = client.use('sample_restaurants')
collection = database[:restaurants]

MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 「Atlas を使い始める」ガイドを参照してください。

実行する書込み操作ごとに、次のいずれかの操作を実装するハッシュを作成します。

  • insert_one

  • update_one

  • update_many

  • replace_one

  • delete_one

  • delete_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 ハッシュを作成し、次の引数を渡します。

  • コレクション内のドキュメントをマッチングするために使用される基準を指定するクエリフィルター

  • 実行する更新操作。 更新操作の詳細については、 MongoDB Serverマニュアルの「 フィールド更新演算子 」ガイドを参照してください。

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 メソッドを構成するために使用できるオプションについて説明しています。

オプション
説明

ordered

If true, the driver performs the write operations in the order provided. If an error occurs, the remaining operations are not attempted.

If false, the driver performs the operations in an arbitrary order and attempts to perform all operations.
Defaults to true.

bypass_document_validation

Specifies whether the update operation bypasses document validation. This lets you update documents that don't meet the schema validation requirements, if any exist. For more information about schema validation, see Schema Validation in the MongoDB Server manual.
Defaults to false.

session

The session to use for the operation.
Type: Session

let

Provides a map of parameter names and values to set top-level variables for the operation. Values must be constant or closed expressions that don't reference document fields.

次のコードでは、オプションを作成し、ordered オプションを false に設定して、順序なしの一括書き込みを指定します。次に、コードは bulk_write メソッドを使用して、前の例と同じ一括操作を実行します。

options = { ordered: false }
collection.bulk_write(writes, options)

順序付けなし一括書き込み 内のいずれかの書き込み操作が失敗した場合、 Rubyドライバーはすべての操作を試行した後にのみエラーを報告します。

注意

順序なしの一括操作では、実行順序は保証されません。 この順序は、ランタイムを最適化するために一覧表示する方法とは異なる場合があります。

bulk_write メソッドからは BulkWrite::Result が返されます。次のインスタンスメソッドを使用して、Resultインスタンスからの情報にアクセスできます。

方式
説明

acknowledged?

Indicates if the server acknowledged the write operation.

deleted_count

Returns the number of documents deleted, if any.

inserted_count

Returns the number of documents inserted, if any.

inserted_ids

Returns the list of inserted document ids, if any.

matched_count

Returns the number of documents matched for an update, if applicable.

modified_count

Returns the number of documents modified, if any.

upserted_count

Returns the number of upserted documents, if any.

upserted_ids

Returns the list of upserted document ids, if any.

個々の書込み操作を実行する方法については、次のガイドを参照してください。

  • ドキュメントの挿入

  • Update Documents

  • Delete Documents

  • ドキュメントの置換

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。

戻る

Delete Documents

項目一覧