Bulk.execute()
Nesta página
Dica
O MongoDB também fornece db.collection.bulkWrite()
para executar operações de escrita em massa.
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çãowriteConcern
documentoOpcional. Documento de write concern para a operação em massa como um todo. Omita o uso padrão. Para um servidor
mongod
autô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 preocupação de gravação 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()
.
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.
Operações Bulk()
em mongosh
e métodos comparáveis nos drivers não têm um limite para o número de operações em um grupo. Para ver como as operações são agrupadas para execução de operações em massa, chame Bulk.getOperations()
após a execução.
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.
Operações Bulk()
em mongosh
e métodos comparáveis nos drivers não têm um limite para o número de operações em um grupo. Para ver como as operações são agrupadas para execução de operações em massa, chame Bulk.getOperations()
após a execução.
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 preocupação de gravação 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: {} })