Visão geral
Neste guia, você aprenderá a executar várias operações de gravação em uma única chamada de banco de dados de dados usando operações de gravação em massa.
Considere um cenário no qual você deseja inserir um documento em uma coleção, atualizar vários outros documentos e, em seguida, excluir um documento. Se você usar funções individuais, cada operação exigirá seu próprio chamar de banco de dados. Em vez disso, você pode usar uma operação em massa para reduzir o número de chamadas ao banco de dados.
O driver C fornece duas APIs de gravar em massa: mongoc_bulkwrite_t e mongoc_bulk_operation_t.
Observação
Se você estiver usando o MongoDB Server 8.0 ou posterior, recomendamos que você use mongoc_bulkwrite_t. Ele pode realizar operações em várias coleções ou bancos de dados em uma única chamar, enquanto mongoc_bulk_operation_t pode ter como alvo apenas uma coleção por chamar.
Dados de amostra
Os exemplos neste guia utilizam a coleção do restaurants no banco de dados do sample_restaurants a partir do conjunto de dados de amostra do Atlas. Para saber como criar um cluster MongoDB Atlas gratuito e carregar os conjuntos de dados de amostra, consulte o guia MongoDB Get Started.
mongoc_bulkwrite_t
Operações de gravar em massa contêm uma ou mais operações de gravar. Para usar uma gravação em massa, crie o tipo de gravação em massa, chame a função de acréscimo correspondente para cada operação que você deseja executar e, em seguida, execute a gravação em massa.
Criar a Operação de gravar em massa
Para criar uma operação de gravar em massa, chame a função mongoc_client_bulkwrite_new(). Esta função retorna um valor do tipo mongoc_bulkwrite_t que você pode usar para armazenar instruções sobre quais operações de gravar você deseja executar. Passe um valor mongoc_client_t como parâmetro para especificar o cliente para gravar em massa.
mongoc_bulkwrite_t *bulk = mongoc_client_bulkwrite_new(client);Adicionar à operação de gravar em massa
Você pode anexar operações de inserção, atualizar, substituição e excluir ao seu valor mongoc_bulkwrite_t.
Inserir operações
Para executar uma operação de inserção, adicione as instruções de inserção ao valor mongoc_bulkwrite_t, que enfileira a operação como parte de gravar em massa.
O exemplo a seguir chama a função mongoc_bulkwrite_append_insertone(). Esta função aceita os seguintes parâmetros:
Parâmetro | Descrição |
|---|---|
| O valor |
| O namespace para inserir o documento, especificado como |
| O documento a inserir. |
| Configurações opcionais para personalizar a operação, ou |
| Recebe detalhes do erro se a função retornar |
O exemplo a seguir anexa uma operação de inserção à gravar em massa:
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);Para inserir vários documentos, chame a função mongoc_bulkwrite_append_insertone() para cada documento.
Atualizar operações
Para realizar uma operação de atualizar, adicione as instruções para atualizar ao valor mongoc_bulkwrite_t, que enfileira a operação como parte de gravar em massa.
O exemplo a seguir chama a função mongoc_bulkwrite_append_updateone(). Esta função aceita os seguintes parâmetros:
Parâmetro | Descrição |
|---|---|
| O valor |
| O namespace que contém os documentos a serem atualizados, especificado como |
| O filtro de queries que seleciona o documento para atualizar. |
| A atualizar para aplicar ao documento correspondente. |
| Configurações opcionais para personalizar a operação, ou |
| Recebe detalhes do erro se a função retornar |
O exemplo a seguir anexa uma operação de atualizar ao bulk 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);Para atualizar vários documentos, chame a função mongoc_bulkwrite_append_updatemany() e passe os parâmetros mostrados no exemplo anterior. Isso instrui o driver a atualizar todos os documentos que correspondem ao seu filtro de queries.
O exemplo a seguir anexa uma operação de atualizar muitos ao gravar em massa:
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);Operações de substituição
Uma operação de substituição remove todos os campos e valores de um documento especificado e os substitui por novos. Para realizar uma operação de substituição, adicione as instruções de substituição ao valor mongoc_bulkwrite_t, que enfileira a operação como parte do gravar em massa.
O exemplo a seguir chama a função mongoc_bulkwrite_append_replaceone(). Esta função aceita os seguintes parâmetros:
Parâmetro | Descrição |
|---|---|
| O valor |
| O namespace que contém os documentos a serem substituídos, especificado como |
| O filtro de queries que seleciona o documento a ser substituído. |
| O documento que substitui o documento correspondente. |
| Configurações opcionais para personalizar a operação, ou |
| Recebe detalhes do erro se a função retornar |
O exemplo a seguir anexa uma operação de substituição à gravar em massa:
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);Para substituir vários documentos, chame a função mongoc_bulkwrite_append_replaceone() para cada documento.
Excluir operações
Para realizar uma operação de excluir, adicione as instruções de excluir ao valor mongoc_bulkwrite_t, que enfileira a operação como parte da gravar em massa.
O exemplo a seguir chama a função mongoc_bulkwrite_append_deleteone(). Esta função aceita os seguintes parâmetros:
Parâmetro | Descrição |
|---|---|
| O valor |
| O namespace que contém os documentos a serem excluídos, especificado como |
| O filtro de queries que seleciona o documento a ser excluído. |
| Configurações opcionais para personalizar a operação, ou |
| Recebe detalhes do erro se a função retornar |
O exemplo a seguir anexa uma operação de excluir à gravar em massa:
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);Para excluir vários documentos, chame a função mongoc_bulkwrite_append_deletemany() e passe os parâmetros mostrados no exemplo anterior. Isso instrui o driver a excluir todos os documentos que correspondem ao seu filtro de queries.
O exemplo a seguir anexa uma operação de excluir muitos:
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);Executar a operação em massa
A função mongoc_bulkwrite_execute() aceita os seguintes parâmetros:
Parâmetro | Descrição |
|---|---|
| O valor |
| Configurações opcionais para personalizar a operação, ou |
Se a operação for bem-sucedida, a função retorna um valor mongoc_bulkwritereturn_t que contém os resultados da operação. Caso contrário, o valor de retorno inclui um valor mongoc_bulkwriteexception_t com os detalhes do erro.
O exemplo a seguir mostra como gravar documentos em massa:
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);O exemplo a seguir chama a função mongoc_bulkwrite_execute() para executar as operações de inserir, atualizar, substituir e excluir.
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);Se alguma operação de gravar falhar, o driver C relata os erros no valor de retorno e não executa nenhuma operação adicional.
Personalizar operações de gravação em massa
O exemplo a seguir cria um valor mongoc_bulkwriteopts_t, define ordered como false e passa as opções para 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);Se qualquer uma das operações de gravação em uma gravação em massa não ordenada falhar, o driver C relatará os erros somente depois de tentar todas as operações.
Observação
Operações em massa não ordenadas não garantem ordem de execução. A ordem pode ser diferente da forma como você os lista para otimizar o tempo de execução.
BulkWriteOptions
A tabela a seguir descreve as opções que você pode especificar no valor mongoc_bulkwriteopts_t para uma operação de gravar em massa:
Opção | Descrição |
|---|---|
| Se |
| Se |
| Especifica a preocupação de gravação para a operação em massa. Para obter mais informações, consulte Write Concern no manual do MongoDB Server . |
| Anexa um comentário à operação. Para obter mais informações, consulte o guia de campos de comando de exclusão no manual do MongoDB Server . |
| Especifica um documento com uma lista de valores para melhorar a legibilidade da operação. Os valores devem ser expressões constantes ou fechadas que não façam referência aos campos do documento . Para obter mais informações, consulte a declaração let no manual do MongoDB Server . |
| Se |
mongoc_bulk_operation_t
Observação
Use mongoc_bulk_operation_t quando você estiver usando uma versão anterior do driver C do que 1.28.0, visando uma versão do MongoDB Server anterior a 8.0, ou apenas precisa gravar em uma única coleção.
Operações de gravar em massa contêm uma ou mais operações de gravar. Para usar uma gravação em massa, crie o tipo de gravação em massa, chame a função de acréscimo correspondente para cada operação que você deseja executar e, em seguida, execute a gravação em massa.
Criar a Operação de gravar em massa
Antes de executar uma operação de gravação em massa, chame a função mongoc_collection_create_bulk_operation_with_opts(). Esta função retorna um valor do tipo mongoc_bulk_operation_t que você pode usar para armazenar instruções sobre quais gravações em massa devem ser executadas.
A função mongoc_collection_create_bulk_operation_with_opts() aceita os seguintes parâmetros:
Parâmetro | Descrição |
|---|---|
| A collection para modificar. |
| Opções para personalizar a operação, ou |
O exemplo a seguir chama a função mongoc_collection_create_bulk_operation_with_opts(), passando a coleção de restaurantes como um parâmetro:
mongoc_bulk_operation_t *bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL);Adicionar à operação de gravar em massa
Você pode anexar operações de inserção, atualizar, substituição e excluir ao seu valor mongoc_bulk_operation_t.
Inserir operações
Para executar uma operação de inserção, adicione as instruções de inserção ao valor mongoc_bulk_operation_t, que enfileira a operação como parte de gravar em massa.
O exemplo a seguir chama a função mongoc_bulk_operation_insert_with_opts(). Esta função aceita os seguintes parâmetros:
Parâmetro | Descrição |
|---|---|
| O valor |
| O documento a inserir. |
| Configurações opcionais para personalizar a operação, ou |
| Uma localização opcional para um valor de erro |
O exemplo a seguir anexa uma operação de inserção à gravar em massa:
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);Para inserir vários documentos, chame a função mongoc_bulk_operation_insert_with_opts() para cada documento.
Atualizar operações
Para realizar uma operação de atualizar, adicione as instruções para atualizar ao valor mongoc_bulk_operation_t, que enfileira a operação como parte de gravar em massa.
O exemplo a seguir chama a função mongoc_bulk_operation_update_one_with_opts(). Esta função aceita os seguintes parâmetros:
Parâmetro | Descrição |
|---|---|
| O valor |
| O filtro de queries que seleciona o documento para atualizar. |
| A atualizar para aplicar ao documento correspondente. |
| Configurações opcionais para personalizar a operação, ou |
| Uma localização opcional para um valor de erro |
O exemplo a seguir anexa uma operação de atualizar ao bulk 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);Para atualizar vários documentos, chame a função mongoc_bulk_operation_update_many_with_opts() e passe os parâmetros mostrados no exemplo anterior. Isso instrui o driver a atualizar todos os documentos que correspondem ao seu filtro de queries.
O exemplo a seguir anexa uma operação de atualizar muitos ao gravar em massa:
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);Operações de substituição
Uma operação de substituição remove todos os campos e valores de um documento especificado e os substitui por novos. Para realizar uma operação de substituição, adicione as instruções de substituição ao valor mongoc_bulk_operation_t, que enfileira a operação como parte do gravar em massa.
O exemplo a seguir chama a função mongoc_bulk_operation_replace_one_with_opts(). Esta função aceita os seguintes parâmetros:
Parâmetro | Descrição |
|---|---|
| O valor |
| O filtro de queries que seleciona o documento a ser substituído. |
| O documento que substitui o documento correspondente. |
| Configurações opcionais para personalizar a operação, ou |
| Uma localização opcional para um valor de erro |
O exemplo a seguir anexa uma operação de substituição à gravar em massa:
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);Para substituir vários documentos, chame a função mongoc_bulk_operation_replace_one_with_opts() para cada documento.
Excluir operações
Para realizar uma operação de excluir, adicione as instruções de excluir ao valor mongoc_bulk_operation_t, que enfileira a operação como parte da gravar em massa.
O exemplo a seguir chama a função mongoc_bulk_operation_remove_one_with_opts(). Esta função aceita os seguintes parâmetros:
Parâmetro | Descrição |
|---|---|
| O valor |
| O filtro de queries que seleciona o documento a ser excluído. |
| Configurações opcionais para personalizar a operação, ou |
| Uma localização opcional para um valor de erro |
O exemplo a seguir anexa uma operação de excluir à gravar em massa:
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);Para excluir vários documentos, chame a função mongoc_bulk_operation_remove_many_with_opts() e passe os parâmetros mostrados no exemplo anterior. Isso instrui o driver a excluir todos os documentos que correspondem ao seu filtro de queries.
O exemplo a seguir anexa uma operação de excluir muitos à gravar em massa:
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);Executar a operação em massa
A função mongoc_bulk_operation_execute() aceita os seguintes parâmetros:
Parâmetro | Descrição |
|---|---|
| O valor |
| Um ponteiro opcional para armazenamento sobrescrevível para o documento de resultados, ou |
| Uma localização opcional para um valor de erro |
O exemplo a seguir mostra como gravar documentos em massa:
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);O exemplo a seguir chama a função mongoc_bulk_operation_execute() para executar as operações de inserir, atualizar, substituir e excluir.
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);Se alguma operação de gravar falhar, o driver C define o parâmetro de saída error e não executa mais nenhuma operação.
Personalizar operações de gravação em massa
Você pode modificar o comportamento da função mongoc_collection_create_bulk_operation_with_opts() passando um documento BSON que especifica valores de opção.
O exemplo a seguir chama a função mongoc_collection_create_bulk_operation_with_opts() e define a opção ordered como 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);Se qualquer uma das operações de gravação em uma gravação em massa não ordenada falhar, o driver C relatará os erros somente depois de tentar todas as operações.
Observação
Operações em massa não ordenadas não garantem ordem de execução. A ordem pode ser diferente da forma como você os lista para otimizar o tempo de execução.
BulkWriteOptions
A tabela a seguir descreve as opções que você pode especificar no documento de opções que você passa para mongoc_collection_create_bulk_operation_with_opts():
Opção | Descrição |
|---|---|
| Se |
| Especifica a preocupação de gravação para a operação em massa. Para obter mais informações, consulte Write Concern no manual do MongoDB Server . |
| Executa as operações em massa dentro da sessão especificada. Para obter mais informações, consulte Sessões do servidor no manual do MongoDB Server. |
| Anexa um comentário à operação. Para obter mais informações, consulte o guia de campos de comando de exclusão no manual do MongoDB Server . |
| Especifica um documento com uma lista de valores para melhorar a legibilidade da operação. Os valores devem ser expressões constantes ou fechadas que não façam referência aos campos do documento . Para obter mais informações, consulte a declaração let no manual do MongoDB Server . |
Informações adicionais
Para saber como realizar operações de escrita individuais, consulte os seguintes guias:
Documentação da API
Para saber mais sobre qualquer uma das funções ou tipos discutidos neste guia, consulte a seguinte documentação da API:
- mongoc_bulkwrite_t
- mongoc_bulk_operation_t