Overview
このガイドでは、一括書込み操作を使用して、1 つのデータベース呼び出しで複数の書込み操作を実行する方法を学習できます。
コレクションにドキュメントを挿入し、他の複数のドキュメントを更新し、その後ドキュメントを削除したい場合を考えます。個別の関数を使用する場合、各操作には個別のデータベースの呼び出しが必要です。その代わりに、バルク操作を使用してデータベースへの呼び出し回数を減らすことができます。
C ドライバーは、2 つのバルク書き込み (write) API を提供します:mongoc_bulkwrite_t と mongoc_bulk_operation_t
注意
MongoDB Server 8.0 以降を使用している場合は、mongoc_bulkwrite_t の使用をお勧めします。これは1回の呼び出しで複数のコレクションまたはデータベースにまたがる操作を実行できます。一方、mongoc_bulk_operation_t は1回の呼び出しで1つのコレクションのみを対象とすることができます。
サンプル データ
このガイドの例では、Atlas のサンプルデータセットから、sample_restaurantsデータベースのrestaurantsコレクションを使用します。MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 MongoDBを使い始めるガイド を参照してください 。
mongoc_bulkwrite_t
Bulk 書き込み (write)操作には、1 つ以上の書き込み (write)操作が含まれています。バルク書き込み (write)を使用するには、バルク書き込み (write)タイプを作成し、実行したい各操作に対して、対応する append 関数を呼び出す、そしてバルク書き込み (write)を実行します。
一括書き込み (write)操作を作成する
バルク書き込み (write)操作を作成するには、mongoc_client_bulkwrite_new() 関数を呼び出します。この関数は、実行する書き込み (write)操作に関する指示を保存するために使用できる mongoc_bulkwrite_t 型の値を返します。バルク書き込み (write)のクライアントを指定するため、mongoc_client_t 値をパラメータとして渡します。
mongoc_bulkwrite_t *bulk = mongoc_client_bulkwrite_new(client);一括書き込み (write)操作に追記する
mongoc_bulkwrite_t 値に、挿入、更新、置換、および削除する操作を追加できます。
挿入操作
挿入操作を実行するには、mongoc_bulkwrite_t 値に挿入指示を追加します。これにより、操作が一括書き込み (write)の一部としてキューに追加されます。
次の例では、mongoc_bulkwrite_append_insertone() 関数を呼び出します。この関数は、次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| 操作を追加する |
| ドキュメントを挿入する名前空間は、 |
| 挿入するドキュメント。 |
| 操作をカスタマイズするための任意の設定、または |
| 関数が |
次の例では、バルク書き込み (write)に挿入操作を追加します。
bson_t *insert_doc = BCON_NEW( "name", BCON_UTF8("Mongo's Deli"), "cuisine", BCON_UTF8("Sandwiches"), "borough", BCON_UTF8("Manhattan"), "restaurant_id", BCON_UTF8("1234"));bson_error_t error;
if (!mongoc_bulkwrite_append_insertone( bulk, "sample_restaurants.restaurants", insert_doc, NULL, &error)) { fprintf(stderr, "Failed to add insert operation: %s\n", error.message);}
bson_destroy(insert_doc);複数のドキュメントを挿入するには、各ドキュメントに対して mongoc_bulkwrite_append_insertone() 関数を呼び出します。
アップデート操作
更新操作を実行するには、mongoc_bulkwrite_t 値に更新指示を追加します。これにより、バルク書き込み (write)の一部として操作がキュー処理されます。
次の例では、mongoc_bulkwrite_append_updateone() 関数を呼び出します。この関数は、次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| 操作を追加する |
|
|
| 更新するドキュメントを選択するクエリフィルター。 |
| 一致したドキュメントに適用する更新。 |
| 操作をカスタマイズするための任意の設定、または |
| 関数が |
次の例では、バルク書き込み (write)に更新操作を追加します。
bson_t *filter_doc = BCON_NEW("name", BCON_UTF8("Mongo's Deli"));bson_t *update_doc = BCON_NEW("$set", "{", "cuisine", BCON_UTF8("Sandwiches and Salads"), "}");bson_error_t error;
if (!mongoc_bulkwrite_append_updateone( bulk, "sample_restaurants.restaurants", filter_doc, update_doc, NULL, &error)) { fprintf(stderr, "Failed to add update operation: %s\n", error.message);}
bson_destroy(filter_doc);bson_destroy(update_doc);複数のドキュメントを更新するには、mongoc_bulkwrite_append_updatemany() 関数を呼び出し、前の例に示されているパラメータを渡します。これによりドライバーに、クエリフィルターに一致するすべてのドキュメントを更新するように指示します。
次の例では、バルク書き込み (write)に複数更新操作を追加します。
bson_t *filter_doc = BCON_NEW("name", BCON_UTF8("Mongo's Deli"));bson_t *update_doc = BCON_NEW("$set", "{", "cuisine", BCON_UTF8("Sandwiches and Salads"), "}");bson_error_t error;
if (!mongoc_bulkwrite_append_updatemany( bulk, "sample_restaurants.restaurants", filter_doc, update_doc, NULL, &error)) { fprintf(stderr, "Failed to add update operation: %s\n", error.message);}
bson_destroy(filter_doc);bson_destroy(update_doc);置換操作
replace 操作では、指定されたドキュメントのすべてのフィールドと値を削除し、新しいフィールドと値に置き換えます。置換操作を実行するには、mongoc_bulkwrite_t 値に置換指示を追加します。これにより、その操作がバルク書き込み (write)の一部としてキューに追加されます。
次の例では、mongoc_bulkwrite_append_replaceone() 関数を呼び出します。この関数は、次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| 操作を追加する |
| 置換するドキュメントを含む名前空間( |
| 置き換えるドキュメントを選択するクエリフィルター。 |
| 一致したドキュメントを置き換えるドキュメント。 |
| 操作をカスタマイズするための任意の設定、または |
| 関数が |
次の例では、バルク書き込み (write)に置換操作を追加します。
bson_t *filter_doc = BCON_NEW("restaurant_id", BCON_UTF8("1234"));bson_t *replace_doc = BCON_NEW( "name", BCON_UTF8("Mongo's Deli"), "cuisine", BCON_UTF8("Sandwiches and Salads"), "borough", BCON_UTF8("Brooklyn"), "restaurant_id", BCON_UTF8("5678"));bson_error_t error;
if (!mongoc_bulkwrite_append_replaceone( bulk, "sample_restaurants.restaurants", filter_doc, replace_doc, NULL, &error)) { fprintf(stderr, "Failed to add replace operation: %s\n", error.message);}
bson_destroy(filter_doc);bson_destroy(replace_doc);複数のドキュメントを置き換えるには、各ドキュメントに対して mongoc_bulkwrite_append_replaceone() 関数を呼び出します。
削除操作
削除する操作を実行するには、mongoc_bulkwrite_t 値に削除する指示を追加します。これにより、バルク書き込み (write)の一部として操作がキューに追加されます。
次の例では、mongoc_bulkwrite_append_deleteone() 関数を呼び出します。この関数は、次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| 操作を追加する |
|
|
| 削除するドキュメントを選択するクエリフィルター。 |
| 操作をカスタマイズするための任意の設定、または |
| 関数が |
次の例では、バルク書き込み (write)に削除する操作を追加します。
bson_t *filter_doc = BCON_NEW("name", BCON_UTF8("Mongo's Deli"));bson_error_t error;
if (!mongoc_bulkwrite_append_deleteone( bulk, "sample_restaurants.restaurants", filter_doc, NULL, &error)) { fprintf(stderr, "Failed to add delete operation: %s\n", error.message);}
bson_destroy(filter_doc);複数のドキュメントを削除するには、mongoc_bulkwrite_append_deletemany() 関数を呼び出し、前の例に示されているパラメータを渡します。これにより、ドライバーは、クエリフィルターと一致する すべてのドキュメントを削除するように指示されます。
次の例では、多数削除する操作を追加します。
bson_t *filter_doc = BCON_NEW("borough", BCON_UTF8("Manhattan"));bson_error_t error;
if (!mongoc_bulkwrite_append_deletemany( bulk, "sample_restaurants.restaurants", filter_doc, NULL, &error)) { fprintf(stderr, "Failed to add delete operation: %s\n", error.message);}
bson_destroy(filter_doc);一括操作の実行
mongoc_bulkwrite_execute() 関数は次のパラメータを受け入れます。
Parameter | 説明 |
|---|---|
| 各書き込み (write)操作の指示を含む |
| 操作をカスタマイズするための任意の設定、または |
操作が成功させる場合、関数は操作結果を含む mongoc_bulkwritereturn_t 値を返します。その他の場合、戻り値にはエラーの詳細と㎎もに mongoc_bulkwriteexception_t 値が含まれます。
以下の例に、ドキュメントをバルク書き込み (write)する方法を示します。
bson_error_t error;
mongoc_bulkwrite_t *bulk = mongoc_client_bulkwrite_new(client);
bson_t *insert_doc = BCON_NEW( "<field name 1>", BCON_UTF8("<value 1>"), "<field name 2>", BCON_UTF8("<value 2>"), "<field name 3>", BCON_UTF8("<value 3>"), "<field name 4>", BCON_UTF8("<value 4>"));
mongoc_bulkwrite_append_insertone( bulk, "sample_restaurants.restaurants", insert_doc, NULL, &error);bson_destroy(insert_doc);
bson_t *query = BCON_NEW("<field to match>", BCON_UTF8("<value to match>"));bson_t *update = BCON_NEW("$set", "{", "<field name>", BCON_UTF8("<value>"), "}");
mongoc_bulkwrite_append_updateone( bulk, "sample_restaurants.restaurants", query, update, NULL, &error);bson_destroy(query);bson_destroy(update);
mongoc_bulkwritereturn_t result = mongoc_bulkwrite_execute(bulk, NULL);
if (result.exc) { if (mongoc_bulkwriteexception_error(result.exc, &error)) { fprintf(stderr, "Bulk write error: %s\n", error.message); }}
mongoc_bulkwriteresult_destroy(result.res);mongoc_bulkwriteexception_destroy(result.exc);mongoc_bulkwrite_destroy(bulk);次の例では、mongoc_bulkwrite_execute() 関数を呼び出して、挿入、更新、置換および削除する操作を実行します。
bson_error_t error;mongoc_bulkwritereturn_t result = mongoc_bulkwrite_execute(bulk, NULL);
if (result.exc) { if (mongoc_bulkwriteexception_error(result.exc, &error)) { fprintf(stderr, "Bulk write error: %s\n", error.message); }} else if (result.res) { printf("Inserted: %" PRId64 " document(s)\n", mongoc_bulkwriteresult_insertedcount(result.res)); printf("Matched: %" PRId64 " document(s)\n", mongoc_bulkwriteresult_matchedcount(result.res)); printf("Modified: %" PRId64 " document(s)\n", mongoc_bulkwriteresult_modifiedcount(result.res)); printf("Deleted: %" PRId64 " document(s)\n", mongoc_bulkwriteresult_deletedcount(result.res));}
mongoc_bulkwriteresult_destroy(result.res);mongoc_bulkwriteexception_destroy(result.exc);書き込み (write)操作が失敗した場合、C ドライバーは戻り値でエラーを報告し、それ以降の操作は実行しません。
一括書き込み操作をカスタマイズ
次の例では、mongoc_bulkwriteopts_t 値を作成し、ordered を false に設定し、オプションを mongoc_bulkwrite_execute() に渡します。
mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new();mongoc_bulkwriteopts_set_ordered(opts, false);
mongoc_bulkwrite_t *bulk = mongoc_client_bulkwrite_new(client);
// Perform bulk operation
mongoc_bulkwritereturn_t result = mongoc_bulkwrite_execute(bulk, opts);
mongoc_bulkwriteresult_destroy(result.res);mongoc_bulkwriteexception_destroy(result.exc);
mongoc_bulkwriteopts_destroy(opts);mongoc_bulkwrite_destroy(bulk);順序付けなし一括書き込み 内のいずれかの書き込み操作が失敗した場合、 Cドライバーはすべての操作を試行した後にのみエラーを報告します。
注意
順序なしの一括操作では、実行順序は保証されません。 この順序は、ランタイムを最適化するために一覧表示する方法とは異なる場合があります。
一括書込みオプション
次の表では、バルク書き込み (write)操作の mongoc_bulkwriteopts_t 値で指定できるオプションについて説明します。
オプション | 説明 |
|---|---|
|
|
|
|
| 一括操作の書込み保証(書込み保証 (write concern)を指定します。 詳細については、 MongoDB Serverマニュアルの「 書込み保証 」を参照してください。 |
| 操作にコメントを付けます。 詳細については、 MongoDB Serverマニュアルの 「削除コマンド フィールドのガイド」を参照してください。 |
| 操作の読みやすさを向上させるために、 の値のリストを含むドキュメントを指定します。 値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。 詳細については、 MongoDB Serverマニュアルの let ステートメントを参照してください。 |
|
|
mongoc_bulk_operation_t
注意
1.28.0 よりも以前の C ドライバー バージョンを使用している場合は、mongoc_bulk_operation_t を使用します。8.0 より古い MongoDB Server のバージョンを対象とする場合、または単一コレクション書き込み (write)のみを必要とする場合。
Bulk 書き込み (write)操作には、1 つ以上の書き込み (write)操作が含まれています。バルク書き込み (write)を使用するには、バルク書き込み (write)タイプを作成し、実行したい各操作に対して、対応する append 関数を呼び出す、そしてバルク書き込み (write)を実行します。
一括書き込み (write)操作を作成する
一括書き込み操作 を実行中前に、mongoc_collection_create_bulk_operation_with_opts() 関数を呼び出します。 この関数は、実行する一括書き込みに関する指示を保存するために使用できる mongoc_bulk_operation_t の値を返します。
mongoc_collection_create_bulk_operation_with_opts() 関数は次のパラメータを受け入れます。
Parameter | 説明 |
|---|---|
| 変更するコレクション。 |
| 操作をカスタマイズするためのオプション、または |
次の例では、restaurants コレクションをパラメータとして渡して、mongoc_collection_create_bulk_operation_with_opts() 関数を呼び出します。
mongoc_bulk_operation_t *bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL);一括書き込み (write)操作に追記する
mongoc_bulk_operation_t 値に、挿入、更新、置換、および削除する操作を追加できます。
挿入操作
挿入操作を実行するには、mongoc_bulk_operation_t 値に挿入指示を追加します。これにより、操作が一括書き込み (write)の一部としてキューに追加されます。
次の例では、mongoc_bulk_operation_insert_with_opts() 関数を呼び出します。この関数は、次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| 操作を追加する |
| 挿入するドキュメント。 |
| 操作をカスタマイズするための任意の設定、または |
|
|
次の例では、バルク書き込み (write)に挿入操作を追加します。
bson_t *insert_doc = BCON_NEW( "name", BCON_UTF8("Mongo's Deli"), "cuisine", BCON_UTF8("Sandwiches"), "borough", BCON_UTF8("Manhattan"), "restaurant_id", BCON_UTF8("1234"));bson_error_t error;
if (!mongoc_bulk_operation_insert_with_opts(bulk, insert_doc, NULL, &error)) { fprintf(stderr, "Failed to add insert operation: %s\n", error.message);}
bson_destroy(insert_doc);複数のドキュメントを挿入するには、各ドキュメントに対して mongoc_bulk_operation_insert_with_opts() 関数を呼び出します。
アップデート操作
更新操作を実行するには、mongoc_bulk_operation_t 値に更新指示を追加します。これにより、バルク書き込み (write)の一部として操作がキュー処理されます。
次の例では、mongoc_bulk_operation_update_one_with_opts() 関数を呼び出します。この関数は、次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| 操作を追加する |
| 更新するドキュメントを選択するクエリフィルター。 |
| 一致したドキュメントに適用する更新。 |
| 操作をカスタマイズするための任意の設定、または |
|
|
次の例では、バルク書き込み (write)に更新操作を追加します。
bson_t *filter_doc = BCON_NEW("name", BCON_UTF8("Mongo's Deli"));bson_t *update_doc = BCON_NEW("$set", "{", "cuisine", BCON_UTF8("Sandwiches and Salads"), "}");bson_error_t error;
if (!mongoc_bulk_operation_update_one_with_opts(bulk, filter_doc, update_doc, NULL, &error)) { fprintf(stderr, "Failed to add update operation: %s\n", error.message);}
bson_destroy(filter_doc);bson_destroy(update_doc);複数のドキュメントを更新するには、mongoc_bulk_operation_update_many_with_opts() 関数を呼び出し、前の例に示されているパラメータを渡します。これによりドライバーに、クエリフィルターに一致するすべてのドキュメントを更新するように指示します。
次の例では、バルク書き込み (write)に複数更新操作を追加します。
bson_t *filter_doc = BCON_NEW("name", BCON_UTF8("Mongo's Deli"));bson_t *update_doc = BCON_NEW("$set", "{", "cuisine", BCON_UTF8("Sandwiches and Salads"), "}");bson_error_t error;
if (!mongoc_bulk_operation_update_many_with_opts(bulk, filter_doc, update_doc, NULL, &error)) { fprintf(stderr, "Failed to add update operation: %s\n", error.message);}
bson_destroy(filter_doc);bson_destroy(update_doc);置換操作
replace 操作では、指定されたドキュメントのすべてのフィールドと値を削除し、新しいフィールドと値に置き換えます。置換操作を実行するには、mongoc_bulk_operation_t 値に置換指示を追加します。これにより、その操作がバルク書き込み (write)の一部としてキューに追加されます。
次の例では、mongoc_bulk_operation_replace_one_with_opts() 関数を呼び出します。この関数は、次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| 操作を追加する |
| 置き換えるドキュメントを選択するクエリフィルター。 |
| 一致したドキュメントを置き換えるドキュメント。 |
| 操作をカスタマイズするための任意の設定、または |
|
|
次の例では、バルク書き込み (write)に置換操作を追加します。
bson_t *filter_doc = BCON_NEW("restaurant_id", BCON_UTF8("1234"));bson_t *replace_doc = BCON_NEW( "name", BCON_UTF8("Mongo's Deli"), "cuisine", BCON_UTF8("Sandwiches and Salads"), "borough", BCON_UTF8("Brooklyn"), "restaurant_id", BCON_UTF8("5678"));bson_error_t error;
if (!mongoc_bulk_operation_replace_one_with_opts(bulk, filter_doc, replace_doc, NULL, &error)) { fprintf(stderr, "Failed to add replace operation: %s\n", error.message);}
bson_destroy(filter_doc);bson_destroy(replace_doc);複数のドキュメントを置き換えるには、各ドキュメントに対して mongoc_bulk_operation_replace_one_with_opts() 関数を呼び出します。
削除操作
削除する操作を実行するには、mongoc_bulk_operation_t 値に削除する指示を追加します。これにより、バルク書き込み (write)の一部として操作がキューに追加されます。
次の例では、mongoc_bulk_operation_remove_one_with_opts() 関数を呼び出します。この関数は、次のパラメーターを受け入れます。
Parameter | 説明 |
|---|---|
| 操作を追加する |
| 削除するドキュメントを選択するクエリフィルター。 |
| 操作をカスタマイズするための任意の設定、または |
|
|
次の例では、バルク書き込み (write)に削除する操作を追加します。
bson_t *filter_doc = BCON_NEW("restaurant_id", BCON_UTF8("5678"));bson_error_t error;
if (!mongoc_bulk_operation_remove_one_with_opts(bulk, filter_doc, NULL, &error)) { fprintf(stderr, "Failed to add delete operation: %s\n", error.message);}
bson_destroy(filter_doc);複数のドキュメントを削除するには、mongoc_bulk_operation_remove_many_with_opts() 関数を呼び出し、前の例に示されているパラメータを渡します。これにより、ドライバーは、クエリフィルターと一致する すべてのドキュメントを削除するように指示されます。
次の例では、バルク書き込み (write)に複数削除する操作を追加します。
bson_t *filter_doc = BCON_NEW("borough", BCON_UTF8("Manhattan"));bson_error_t error;
if (!mongoc_bulk_operation_remove_many_with_opts(bulk, filter_doc, NULL, &error)) { fprintf(stderr, "Failed to add delete operation: %s\n", error.message);}
bson_destroy(filter_doc);一括操作の実行
mongoc_bulk_operation_execute() 関数は次のパラメータを受け入れます。
Parameter | 説明 |
|---|---|
| 各書き込み (write)操作の指示を含む |
| 結果ドキュメント用の上書き可能なストレージへの任意のポインター、または |
|
|
以下の例に、ドキュメントをバルク書き込み (write)する方法を示します。
bson_error_t error;
mongoc_bulk_operation_t *bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL);
bson_t *insert_doc = BCON_NEW( "<field name>", BCON_UTF8("<value>"), "<field name>", BCON_UTF8("<value>"), "<field name>", BCON_UTF8("<value>"), "<field name>", BCON_UTF8("<value>"));
mongoc_bulk_operation_insert(bulk, insert_doc);bson_destroy(insert_doc); bson_t *query = BCON_NEW("<field to match>", BCON_UTF8("<value to match>"));bson_t *update = BCON_NEW("$set", "{", "<field name>", BCON_UTF8("<value>"), "}");
mongoc_bulk_operation_update_one(bulk, query, update, false);bson_destroy(query);bson_destroy(update);
bool result = mongoc_bulk_operation_execute(bulk, NULL, &error);if (!result) { fprintf(stderr, "Bulk operation error: %s\n", error.message);}
mongoc_bulk_operation_destroy(bulk);次の例では、mongoc_bulk_operation_execute() 関数を呼び出して、挿入、更新、置換および削除する操作を実行します。
bson_error_t error;bool result = mongoc_bulk_operation_execute(bulk, NULL, &error);
if (!result) { printf("Bulk operation error: %s\n", error.message);}
mongoc_bulk_operation_destroy(bulk);いずれかの書き込み (write)操作が失敗した場合、C ドライバーは error 出力パラメータを設定し、それ以降の操作は行われません。
一括書き込み操作をカスタマイズ
オプション値を指定する BSON ドキュメントを渡すことによって、mongoc_collection_create_bulk_operation_with_opts() 関数の挙動を変更することができます。
次の例では、 mongoc_collection_create_bulk_operation_with_opts() 関数を呼び出し、ordered オプションを false に設定します。
bson_t opts;BSON_APPEND_BOOL(&opts, "ordered", false);bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts);
// Perform bulk operation
bson_destroy(&opts);mongoc_bulk_operation_destroy(bulk);順序付けなし一括書き込み 内のいずれかの書き込み操作が失敗した場合、 Cドライバーはすべての操作を試行した後にのみエラーを報告します。
注意
順序なしの一括操作では、実行順序は保証されません。 この順序は、ランタイムを最適化するために一覧表示する方法とは異なる場合があります。
一括書込みオプション
次の表には、mongoc_collection_create_bulk_operation_with_opts()に渡すオプション ドキュメント内で指定できるオプションについて説明します。
オプション | 説明 |
|---|---|
|
|
| 一括操作の書込み保証(書込み保証 (write concern)を指定します。 詳細については、 MongoDB Serverマニュアルの「 書込み保証 」を参照してください。 |
| 指定されたセッション内でバルク操作を実行します。詳細については、MongoDB Serverマニュアルの「サーバー セッション」を参照してください。 |
| 操作にコメントを付けます。 詳細については、 MongoDB Serverマニュアルの 「削除コマンド フィールドのガイド」を参照してください。 |
| 操作の読みやすさを向上させるために、 の値のリストを含むドキュメントを指定します。 値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。 詳細については、 MongoDB Serverマニュアルの let ステートメントを参照してください。 |
詳細情報
個々の書込み操作を実行する方法については、次のガイドを参照してください。
API ドキュメント
このガイドで説明した関数や型の詳細については、次のAPIドキュメントを参照してください。
- mongoc_bulkwrite_t
- mongoc_bulk_operation_t