Dica
O MongoDB também fornece db.collection.bulkWrite() para executar operações de escrita em lote.
Descrição
Bulk.execute()Executa a lista de operações criadas pelo construtor de operações do
Bulk().Bulk.execute()aceita o seguinte parâmetro:ParâmetroTipoDescriçãowriteConcerndocumento
Opcional. Documento de write concern para a operação em massa como um todo. Omita o uso padrão. Para um servidor
mongodautônomo, o padrão da write concern é{ w: majority }. Com um conjunto de réplicas, a write concern padrão é{ w: majority }, a menos que seja modificada como parte da configuração do conjunto de réplicas ou potencialmente se o conjunto de réplicas contiver vários arbiters.Consulte Substituir write concern padrão para obter um exemplo.
Não defina explicitamente a preocupação de gravação para a operação se for executada em uma transação. Para usar write concern com transações, consulte Transações e write concern.
Retorna: Um objeto
BulkWriteResult()que contém o status da operação.Após a execução, você não pode executar novamente o objeto
Bulk()sem reinicializar. Consultedb.collection.initializeUnorderedBulkOp()edb.collection.initializeOrderedBulkOp().
Compatibilidade
Esse comando está disponível em implantações hospedadas nos seguintes ambientes:
- MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
Observação
This command is supported in all MongoDB Atlas clusters. For information on Atlas support for all commands, see Unsupported Commands.
Comportamento
Operações ordenadas
Ao executar uma lista ordered de operações, o MongoDB agrupa as operações por operation type e contiguidade, ou seja, operações contíguas do mesmo tipo são agrupadas. Por exemplo, se uma lista ordenada tiver duas operações de inserção seguidas por uma operação de atualização seguida por outra operação de inserção, o MongoDB agrupa as operações em três grupos separados: o primeiro contém as duas operações de inserção, o grupo contém a operação de atualização e o terceiro contém a última operação de inserção. Esse comportamento está sujeito a alterações em versões futuras.
Bulk() operations in mongosh and comparable methods in the drivers do not have a limit for the number of operations in a group. To see how the operations are grouped for bulk operation execution, call Bulk.getOperations() after the execution.
A execução de uma lista de operações ordered em uma collection fragmentada geralmente será mais lenta do que a execução de uma lista unordered, já que, com uma lista ordenada, cada operação deve aguardar a conclusão da operação anterior.
Operações não ordenadas
Ao executar uma lista unordered de operações, o MongoDB agrupa as operações. Com uma operação em massa não ordenada, as operações na lista podem ser reordenadas para aumentar o desempenho. Dessa forma, os aplicativos não devem depender da ordem ao executar unordered operações em massa.
Bulk() operations in mongosh and comparable methods in the drivers do not have a limit for the number of operations in a group. To see how the operations are grouped for bulk operation execution, call Bulk.getOperations() after the execution.
Transações
Bulk() pode ser usado dentro de transações distribuídas.
Para operações Bulk.insert(), a collection já deve existir.
Para Bulk.find.upsert(), se a operação resultar em um upsert, a collection já deverá existir.
Não defina explicitamente a preocupação de gravação para a operação se for executada em uma transação. Para usar write concern com transações, consulte Transações e write concern.
Importante
Na maioria dos casos, uma transação distribuída incorre em um custo de desempenho maior do que as gravações de um único documento, e a disponibilidade de transações distribuídas não deve substituir o design eficaz do esquema. Em muitos cenários, o modelo de dados desnormalizado (documentos e arrays incorporados) continuará a ser ideal para seus dados e casos de uso. Ou seja, para muitos cenários, modelar seus dados adequadamente minimizará a necessidade de transações distribuídas.
Para considerações adicionais sobre o uso de transações (como limite de tempo de execução e limite de tamanho do oplog), consulte também Considerações de produção.
Exemplos
Executar operações em massa
O seguinte inicializa um construtor de operações de Bulk() na collection items, adiciona uma série de operações de inserção e executa as operações:
var bulk = db.items.initializeUnorderedBulkOp(); bulk.insert( { item: "abc123", status: "A", defaultQty: 500, points: 5 } ); bulk.insert( { item: "ijk123", status: "A", defaultQty: 100, points: 10 } ); bulk.execute( );
A operação retorna o seguinte objeto BulkWriteResult():
BulkWriteResult({ acknowledged: true, insertedCount: 2, insertedIds: { '0': ObjectId("64e61e3b84ff8808cd43a92c"), '1': ObjectId("64e61e3b84ff8808cd43a92d") }, matchedCount: 0, modifiedCount: 0, deletedCount: 0, upsertedCount: 0, upsertedIds: {} })
Para obter detalhes sobre o objeto de retorno, consulte BulkWriteResult(). Para detalhes sobre os lotes executados, consulte Bulk.getOperations().
Substituir write concern padrão
A operação a seguir para um conjunto de réplicas especifica uma write concern de "w: 1" com wtimeout de 5000 milissegundos, de modo que o método retorne após as escritas se propagarem para a maioria dos membros do conjunto de réplicas de votação ou o método expire após cinco segundos.
var bulk = db.items.initializeUnorderedBulkOp(); bulk.insert( { item: "efg123", status: "A", defaultQty: 100, points: 0 } ); bulk.insert( { item: "xyz123", status: "A", defaultQty: 100, points: 0 } ); bulk.execute( { w: 1, wtimeout: 5000 } );
A operação retorna o seguinte objeto BulkWriteResult():
BulkWriteResult({ acknowledged: true, insertedCount: 2, insertedIds: { '0': ObjectId("64e61e3b84ff8808cd43a92c"), '1': ObjectId("64e61e3b84ff8808cd43a92d") }, matchedCount: 0, modifiedCount: 0, deletedCount: 0, upsertedCount: 0, upsertedIds: {} })
Dica
Bulk() para obter uma lista dos métodos disponíveis para operações em massa.