一括書き込み操作
項目一覧
Overview
このガイドでは、一括書込み操作を使用して、1 つのデータベース呼び出しで複数の書込み操作を実行する方法を学習できます。
コレクションにドキュメントを挿入 し、複数の他のドキュメントを更新してから、ドキュメントを削除するシナリオを考えてみましょう。 個々のメソッドを使用する場合、各操作には独自のデータベース呼び出しが必要です。 代わりに、 一括操作を使用して、データベースへの呼び出し回数を減らすことができます。
サンプル データ
このガイドの例では、 Atlasサンプルデータセットのsample_restaurants
データベース内の restaurants
コレクションを使用します。 C++アプリケーションからこのコレクションにアクセスするには、Atlasmongocxx::client
クラスターに接続する をインスタンス化し、 変数と 変数に次の値を割り当てます。db
collection
auto db = client["sample_restaurants"]; auto collection = db["restaurants"];
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 「Atlas を使い始める」ガイドを参照してください。
一括書込み (write) インスタンスの作成
一括書込み操作を実行中する前に、コレクションでcreate_bulk_write()
メソッドを呼び出します。 このメソッドは、実行する一括書き込みのタイプに関する指示を保存するために使用できるmongocxx::bulk_write
クラスのインスタンスを返します。
次の例では、 restaurants
コレクションでcreate_bulk_write()
メソッドを呼び出します。
auto bulk = collection.create_bulk_write();
次に、 mongocxx::bulk_write
インスタンスに書込みモデルを追加して、 一括操作を定義できます。 詳細については、次の「 書込み操作の定義 」セクションを参照してください。
書込み (write) 操作を定義する
実行する書込み操作ごとに、次のいずれかのモデル クラスのインスタンスを作成します。
mongocxx::model::insert_one
mongocxx::model::update_one
mongocxx::model::update_many
mongocxx::model::replace_one
mongocxx::model::delete_one
mongocxx::model::delete_many
次に、 create_bulk_write()
メソッドによって返されたmongocxx::bulk_write
インスタンスに各書き込みモデルを追加します。
次のセクションでは、前述の書込みモデル クラスのインスタンスを作成して使用する方法を示します。
挿入操作
挿入操作を実行するには、 mongocxx::model::insert_one
クラスのインスタンスを作成し、挿入するドキュメントを指定します。 次に、モデルインスタンスをmongocxx::bulk_write
クラスのインスタンスに追加します。
次の例では、 mongocxx::model::insert_one
のインスタンスを作成し、それをbulk
と呼ばれるmongocxx::bulk_write
インスタンスに追加します。
auto insert_doc = make_document(kvp("name", "Mongo's Deli"), kvp("cuisine", "Sandwiches"), kvp("borough", "Manhattan"), kvp("restaurant_id", "1234")); mongocxx::model::insert_one insert_op{insert_doc.view()}; bulk.append(insert_op);
複数のドキュメントを挿入するには、ドキュメントごとにmongocxx::model::insert_one
のインスタンスを作成します。
アップデート操作
ドキュメントを更新するには、 mongocxx::model::update_one
のインスタンスを作成します。 このモデルは、クエリフィルターに一致する最初のドキュメントを更新するようにドライバーに指示します。 次に、モデルインスタンスをmongocxx::bulk_write
クラスのインスタンスに追加します。
次の引数をmongocxx::model::update_one
モデルに渡します。
クエリフィルタードキュメントは、コレクション内のドキュメントをマッチングするために使用される基準を指定します。
ドキュメントを更新し、実行する更新の種類を指定します。 更新操作の詳細については、 MongoDB Serverマニュアルの「フィールド更新演算子」ガイドを参照してください。
次の例では、 mongocxx::model::update_one
のインスタンスを作成し、それをbulk
と呼ばれるmongocxx::bulk_write
インスタンスに追加します。
auto filter_doc = make_document(kvp("name", "Mongo's Deli")); auto update_doc = make_document(kvp("$set", make_document(kvp("cuisine", "Sandwiches and Salads")))); mongocxx::model::update_one update_op{filter_doc.view(), update_doc.view()}; bulk.append(update_op);
複数のドキュメントを更新するには、 mongocxx::model::update_many
のインスタンスを作成し、同じ引数で渡します。 このモデルは、クエリフィルターに一致するすべてのドキュメントを更新するようにドライバーに指示します。
次の例では、 mongocxx::model::update_many
のインスタンスを作成し、それをbulk
に追加します。
auto filter_doc = make_document(kvp("name", "Mongo's Deli")); auto update_doc = make_document(kvp("$set", make_document(kvp("cuisine", "Sandwiches and Salads")))); mongocxx::model::update_many update_op{filter_doc.view(), update_doc.view()}; bulk.append(update_op);
置換操作
置換操作により、指定されたドキュメントのすべてのフィールドと値が削除され、新しいフィールドと値に置き換えられます。 置換操作を実行するには、 mongocxx::model::replace_one
クラスのインスタンスを作成し、そのインスタンスにクエリフィルターと 一致するドキュメントに保存するフィールドと値を渡します。 次に、モデルインスタンスをmongocxx::bulk_write
クラスのインスタンスに追加します。
次の例では、 mongocxx::model::replace_one
のインスタンスを作成し、それをbulk
と呼ばれるmongocxx::bulk_write
インスタンスに追加します。
auto filter_doc = make_document(kvp("restaurant_id", "1234")); auto replace_doc = make_document(kvp("name", "Mongo's Deli"), kvp("cuisine", "Sandwiches and Salads"), kvp("borough", "Brooklyn"), kvp("restaurant_id", "5678")); mongocxx::model::replace_one replace_op{filter_doc.view(), replace_doc.view()}; bulk.append(replace_op);
複数のドキュメントを置き換えるには、ドキュメントごとにmongocxx::model::replace_one
の新しいインスタンスを作成する必要があります。
削除操作
ドキュメントを削除するには、 mongocxx::model::delete_one
クラスのインスタンスを作成し、削除するドキュメントを指定するクエリフィルターを渡します。 このモデルは、クエリフィルターに一致する最初のドキュメントのみを削除するようにドライバーに指示します。 次に、モデルインスタンスをmongocxx::bulk_write
クラスのインスタンスに追加します。
次の例では、 mongocxx::model::delete_one
のインスタンスを作成し、それをbulk
と呼ばれるmongocxx::bulk_write
インスタンスに追加します。
auto filter_doc = make_document(kvp("restaurant_id", "5678")); mongocxx::model::delete_one delete_op{filter_doc.view()}; bulk.append(delete_op);
複数のドキュメントを削除するには、 mongocxx::model::delete_many
クラスのインスタンスを作成し、削除するドキュメントを指定するクエリフィルターで渡します。 このモデルは、クエリフィルターに一致するすべてのドキュメントを削除するようにドライバーに指示します。
次の例では、 mongocxx::model::delete_many
のインスタンスを作成し、それをbulk
に追加します。
auto filter_doc = make_document(kvp("borough", "Manhattan")); mongocxx::model::delete_many delete_op{filter_doc.view()}; bulk.append(delete_op);
一括操作の実行
一括操作を実行するには、書込みモデルを含むmongocxx::bulk_write
クラスのインスタンスでexecute()
メソッドを呼び出します。 デフォルトでは 、 execute()
メソッドはmongocxx::bulk_write
インスタンスに追加された順序で操作を実行します。
次の例では、対応する各書込みモデルをmongocxx::bulk_write
のインスタンスに追加し、 execute()
メソッドを呼び出すことで、このガイドの前述のセクションで指定されている挿入、更新、置換、および削除操作を実行します。 次に、変更されたドキュメントの数を表示します。
auto bulk = collection.create_bulk_write(); // Specifies documents to insert, update, replace, or delete auto insert_doc = make_document(kvp("name", "Mongo's Deli"), kvp("cuisine", "Sandwiches"), kvp("borough", "Manhattan"), kvp("restaurant_id", "1234")); auto update_filter = make_document(kvp("name", "Mongo's Deli")); auto update_doc = make_document(kvp("$set", make_document(kvp("cuisine", "Sandwiches and Salads")))); auto replace_filter = make_document(kvp("restaurant_id", "1234")); auto replace_doc = make_document(kvp("name", "Mongo's Deli"), kvp("cuisine", "Sandwiches and Salads"), kvp("borough", "Brooklyn"), kvp("restaurant_id", "5678")); auto delete_filter = make_document(kvp("borough", "Manhattan")); // Creates write models for each write operation using the preceding documents mongocxx::model::insert_one insert_op{insert_doc.view()}; mongocxx::model::update_many update_op{update_filter.view(), update_doc.view()}; mongocxx::model::replace_one replace_op{replace_filter.view(), replace_doc.view()}; mongocxx::model::delete_many delete_op{delete_filter.view()}; // Appends each write model to the bulk operation bulk.append(insert_op); bulk.append(update_op); bulk.append(replace_op); bulk.append(delete_op); // Runs the bulk operation auto result = bulk.execute(); std::cout << "Modified documents: " << result->modified_count() << std::endl;
Modified documents: 2
書き込み操作のいずれかが失敗した場合、 C++ドライバーはmongocxx::bulk_write_exception
を発生させ、それ以上の操作を実行しません。
Tip
modified_count()
関数の詳細については、このガイドの「戻り値 」セクションを参照してください。
一括書き込み操作をカスタマイズ
mongocxx::options::bulk_write
クラスのインスタンスをパラメーターとして渡すことで、 create_bulk_write()
メソッドの動作を変更できます。 次の表では、 mongocxx::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 operation bypasses document-level validation. For more
information, see Schema
Validation in the MongoDB
Server manual. Defaults to false . |
write_concern | Specifies the write concern for the bulk operation. For more information, see
Write Concern in the MongoDB Server manual. |
comment | Attaches a comment to the operation. For more information, see the delete command
fields guide in the
MongoDB Server manual. |
let | Specifies a document with a list of values to improve operation readability. Values
must be constant or closed expressions that don't reference document fields. For more
information, see the let statement in the MongoDB Server manual. |
次の例では、このページの 一括書込みインスタンスの作成 の例からcreate_bulk_write()
メソッドを呼び出しますが、 mongocxx::options::bulk_write
インスタンスのordered
フィールドをfalse
に設定します。
mongocxx::options::bulk_write opts; opts.ordered(false); auto bulk = collection.create_bulk_write(opts);
順序付けなし一括書き込み 内のいずれかの書込み操作が失敗した場合、 C++ドライバーはすべての操作を試行した後にのみエラーを報告します。
注意
順序なしの一括操作では、実行順序は保証されません。 この順序は、ランタイムを最適化するために一覧表示する方法とは異なる場合があります。
戻り値
execute()
メソッドはmongocxx::result::bulk_write
クラスのインスタンスを返します。 mongocxx::result::bulk_write
クラスには、次のメンバー関数が含まれています。
関数 | 説明 |
---|---|
deleted_count() | Returns the number of documents deleted, if any. |
inserted_count() | Returns the number of documents inserted, 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 documents upserted, if any. |
upserted_ids() | Returns a map of the operation's index to the _id of the upserted documents, if
applicable. |
詳細情報
個々の書込み操作を実行する方法については、次のガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。