Visão geral
O MongoDB oferece aos clientes a capacidade de realizar operações de gravação em massa. A partir do MongoDB 8.0, você pode executar operações de gravação em massa em vários bancos de dados e collections. Se você estiver usando uma versão anterior ao MongoDB 8.0, poderá executar operações de gravação em massa em uma única coleção.
Para realizar operações de escrita em massa em vários bancos de dados e collections no MongoDB 8.0, use o comando de banco de dadosbulkWrite ou o método Mongo.bulkWrite() mongosh.
Para executar operações de escrita em massa em uma única collection, use o método db.collection.bulkWrite() mongosh. Se você estiver executando o MongoDB 8.0 ou posterior, também poderá usar bulkWrite ou Mongo.bulkWrite() para escrever em uma única collection.
Operações ordenadas versus não ordenadas
As operações de gravação em massa são executadas em série (ordenadas) ou em qualquer ordem (não ordenada). Por padrão, as operações são ordenadas e param no primeiro erro. As operações não ordenadas continuam apesar dos erros e podem ser executadas em paralelo, o que as torna normalmente mais rápidas para coleções fragmentadas.
Para obter informações detalhadas sobre o comportamento de execução e o tratamento de erros, consulte db.collection.bulkWrite() Mongo.bulkWrite()ou.
Operações suportadas
Suporte a operações de gravação em massa: Inserir um, atualizar um, atualizar muitos, substituir um, excluir um e excluir muitos.
Estratégias para inserção em massa em uma coleção compartilhada
Grandes operações de inserção em massa podem impacto o desempenho de cluster fragmentado . Para otimizar gravações em massa em coleções fragmentadas:
Pré-divisão da coleção
Se sua coleção fragmentada estiver vazia e você não estiver usando fragmentação com hash para a primeira chave da sua chave de fragmento, então sua coleção terá apenas um chunk inicial, que reside em um único fragmento. O MongoDB deve então dedicar tempo para receber dados e distribuir as partes para os fragmentos disponíveis. Para evitar esse custo de desempenho, pré-divida a coleção criando intervalos em um cluster fragmentado.
Gravações não ordenadas em mongos
Para melhorar o desempenho de gravação em clusters fragmentados, execute uma gravação em massa não ordenada definindo ordered como false quando executar uma gravação em massa. tenta enviar as gravaçõesmongos para vários fragmentos simultaneamente. Para coleções vazias , primeiro pré-dividir a coleção conforme descrito em Dividir partes em um cluster fragmentado.
Evite a aceleração monotônica
Se sua chave de estilhaço aumenta monotonicamente durante uma inserção, todos os dados inseridos vão para o último bloco da coleção, que sempre terminará em um único fragmento. Portanto, a capacidade de inserção do cluster nunca excederá a capacidade de inserção desse único fragmento.
Se o volume de inserção for maior do que o que um único estilhaço pode processar e se você não puder evitar uma chave de estilhaço monotonicamente crescente, considere as seguintes modificações no aplicativo:
Inverta os bits binários da chave de fragmento. Isso preserva as informações e evita correlacionar a ordem de inserção com a crescente sequência de valores.
Troque a primeira e a última palavras de 16 bits para "embaralhar" as inserções.
Exemplo
O exemplo a seguir, em C++, troca a palavra de 16 bits inicial e final dos BSON ObjectIds gerados para que eles não sejam mais monotonicamente crescentes.
using namespace mongo; OID make_an_id() { OID x = OID::gen(); const unsigned char *p = x.getData(); swap( (unsigned short&) p[0], (unsigned short&) p[10] ); return x; } void foo() { // create an object BSONObj o = BSON( "_id" << make_an_id() << "x" << 3 << "name" << "jane" ); // now we may insert o into a sharded collection }