Operações de gravação em massa
Nesta página
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 excluir um documento. Se você usar funções individuais, cada operação exigirá sua própria chamada de banco de dados de dados. Em vez disso, você pode usar uma operação em massa para reduzir o número de chamadas para o banco de dados de dados.
Dados de amostra
Os exemplos neste guia utilizam a coleção do restaurants
no banco de dados de dados do sample_restaurants
a partir dos conjuntos 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 Iniciar com Atlas .
Iniciar a operação de gravação 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:
Collection: especifica a collection a ser modificada
documento de opções : especifica opções para personalizar a operação ou
NULL
O exemplo a seguir chama a função mongoc_collection_create_bulk_operation_with_opts()
e passa a coleção restaurants
como um parâmetro:
mongoc_bulk_operation_t *bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL);
Em seguida, você pode adicionar instruções de escrita à operação em massa. Para obter mais informações, consulte a seguinte seção Definir as operações de gravação .
Definir as operações de gravação
Você pode definir uma operação de gravação e adicioná-la à gravação em massa ligando para os seguintes métodos:
mongoc_bulk_operation_insert_with_opts()
mongoc_bulk_operation_update_one_with_opts()
mongoc_bulk_operation_update_many_with_opts()
mongoc_bulk_operation_replace_one_with_opts()
mongoc_bulk_operation_remove_one_with_opts()
mongoc_bulk_operation_remove_many_with_opts()
As seções a seguir mostram como usar esses métodos para especificar suas operações de gravação correspondentes.
Inserir operações
Para executar uma operação de inserção, adicione as instruções de inserção ao mongoc_bulk_operation_t
, que classifica a operação como parte da gravação em massa.
O exemplo a seguir chama a função mongoc_bulk_operation_insert_with_opts()
, passando o documento para inserir e o valor mongoc_bulk_operation_t
como parâmetros:
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 mongoc_bulk_operation_insert_with_opts()
para cada documento.
Atualizar operações
Para executar uma operação de atualização, adicione as instruções de atualização ao mongoc_bulk_operation_t
, que enfileira a operação como parte da gravação em massa.
O exemplo a seguir chama a função mongoc_bulk_operation_update_one_with_opts()
, passando um filtro de query, atualizações de documento e o valor mongoc_bulk_operation_t
como parâmetros:
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 mongoc_bulk_operation_update_many_with_opts()
e passe os mesmos parâmetros. Isso instrui o driver a atualizar todos os documentos que correspondem ao seu filtro de consulta.
O exemplo a seguir enfileira uma operação de atualização de muitos para a escrita 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 executar uma operação de substituição, adicione as instruções de substituição ao mongoc_bulk_operation_t
, que classifica a operação como parte da gravação em massa.
O exemplo a seguir chama a função mongoc_bulk_operation_replace_one_with_opts()
, passando um filtro de query, um documento de substituição e o valor mongoc_bulk_operation_t
como parâmetros:
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 mongoc_bulk_operation_replace_one_with_opts()
para cada documento.
Excluir operações
Para executar uma operação de exclusão, adicione as instruções de exclusão ao mongoc_bulk_operation_t
, que enfileira a operação como parte da gravação em massa.
O exemplo seguinte chama a função mongoc_bulk_operation_remove_one_with_opts()
, passando um filtro de query e o valor mongoc_bulk_operation_t
como parâmetros:
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 mongoc_bulk_operation_remove_many_with_opts()
função e passe os mesmos parâmetros. Isso instrui o driver a excluir todos os documentos que correspondem ao seu filtro de query.
O exemplo a seguir enfileira uma operação de exclusão de muitos para a gravação 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
Para executar cada operação de gravação enfileirada na gravação em massa, chame a função mongoc_bulk_operation_execute()
. Esta função aceita os seguintes parâmetros:
valor mongoc_bulk_operation_t: contém as instruções para cada operação de gravação
Localização dos resultados: especifica um ponteiro para o armazenamento substituível que conterá os resultados da operação ou
NULL
Local do erro: especifica um local para um valor de erro ou
NULL
O exemplo a seguir executa as operações de inserção, atualização, substituição e exclusão especificadas nas seções anteriores deste guia chamando a mongoc_bulk_operation_execute()
função:
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 qualquer uma das operações de gravação falhar, o driver C definirá o erro de saída e não executará 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 os valores das opções. A tabela a seguir descreve as opções que você pode definir no documento:
Opção | Descrição |
---|---|
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 . |
writeConcern | Specifies the write concern for the bulk operation. For more information, see
Write Concern in the MongoDB Server manual. |
sessionId | Runs the bulk operations within the specified session. For more information, see
Server Sessions 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. |
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.
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: