Gravações em massa
Nesta página
A API de gravação em massa envia várias operações de gravação para o servidor em um único comando. Use a API de gravação em massa para reduzir o número de viagens de ida e volta da rede ao realizar várias gravações por vez. Por exemplo, para realizar várias atualizações com eficiência, pode-se fazer:
collection = client['colors'] collection.bulk_write([ { update_one: { filter: {name: 'yellow'}, update: {'$set' => {hex: 'ffff00'}}, }, }, { update_one: { filter: {name: 'purple'}, update: {'$set' => {hex: '800080'}}, }, }, ], ordered: true, write_concern: {w: :majority})
O exemplo a seguir mostra como executar diferentes tipos de operações na mesma solicitação:
collection.bulk_write([ { insert_one: { x: 1 } }, { update_one: { filter: { x: 1 }, update: {'$set' => { x: 2 } }, } }, { replace_one: { filter: { x: 2 }, replacement: { x: 3 }, } }, ], :ordered => true)
O primeiro argumento para bulk_write
é a lista de operações a serem executadas. Cada operação deve ser especificada como um hash com exatamente uma chave que é o nome da operação e a especificação da operação como o valor correspondente. As operações suportadas são detalhadas abaixo. O método bulk_write
também aceita as seguintes opções:
Opção | Descrição |
---|---|
bypass_document_validation | true ou false . Se deve ignorar a validação do documento . |
ordered | Se a opção ordered estiver definida como true (que é o padrão), as operações serão aplicadas em ordem e, se qualquer operação falhar, as operações subsequentes não serão tentadas. Se a opção ordered estiver definida para false , todas as operações especificadas serão tentadas. |
write_concern | A referência de escrita para a operação, especificada como um hash. |
As operações válidas de escrita em massa são as seguintes:
insert_one
{ insert_one: { x: 1 } }
Observação
Não há nenhuma operação em massa insert_many
. Para inserir vários documentos, especifique várias operações insert_one
.
update_one
{ update_one: { filter: { x: 1 }, update: { '$set' => { x: 2 } }, # upsert is optional and defaults to false upsert: true, } }
update_many
{ update_many: { filter: { x: 1 }, update: { '$set' => { x: 2 } }, # upsert is optional and defaults to false :upsert => true, } }
replace_one
{ replace_one: { filter: { x: 1 }, replacement: { x: 2 }, # upsert is optional and defaults to false upsert: true, } }
Observação
A operação :replace_one
exige que o valor de substituição seja um documento. :replace_one
não reconhece os operadores de atualização do MongoDB no valor de substituição. Em uma versão futura, espera-se que o driver proíba o uso de chaves que começam com $
no documento de substituição.
delete_one
{ delete_one: { filter: { x: 1 }, } }
delete_many
{ delete_many: { filter: { x: 1 }, } }
Divisão de gravação em massa
O driver permite que o aplicativo envie solicitações de gravação em massa arbitrariamente grandes. No entanto, como o MongoDB Server limita o tamanho dos documento de comando (atualmente esse limite é de 48 MiB), as gravações em massa que excederem esse limite serão sujeitas a divisão em várias solicitações.
Quandoa criptografia do lado do cliente é usada, o limite usado para a divisão de gravação em massa é reduzido para permitir a sobrecarga no texto cifrado.