MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Inserção de lote do Mongoose (mongodb)?

Model.create() vs Model.collection.insert():uma abordagem mais rápida


Model.create() é uma maneira ruim de fazer inserções se você estiver lidando com um volume muito grande. Será muito lento . Nesse caso, você deve usar Model.collection.insert , que tem um desempenho muito melhor . Dependendo do tamanho do volume, Model.create() vai mesmo bater! Tentei com um milhão de documentos, sem sorte. Usando Model.collection.insert levou apenas alguns segundos.
Model.collection.insert(docs, options, callback)
  • docs é o array de documentos a serem inseridos;
  • options é um objeto de configuração opcional - veja os documentos
  • callback(err, docs) será chamado depois que todos os documentos forem salvos ou ocorrer um erro. Em caso de sucesso, docs é a matriz de documentos persistentes.

Como o autor do Mongoose aponta aqui, esse método ignorará quaisquer procedimentos de validação e acessará o driver do Mongo diretamente. É uma troca que você precisa fazer, já que está lidando com uma grande quantidade de dados, caso contrário, você não poderá inseri-los em seu banco de dados (lembre-se de que estamos falando de centenas de milhares de documentos aqui).

Um exemplo simples

var Potato = mongoose.model('Potato', PotatoSchema);

var potatoBag = [/* a humongous amount of potato objects */];

Potato.collection.insert(potatoBag, onInsert);

function onInsert(err, docs) {
    if (err) {
        // TODO: handle error
    } else {
        console.info('%d potatoes were successfully stored.', docs.length);
    }
}

Atualização de 22/06/2019 :embora insert() ainda pode ser usado muito bem, foi preterido em favor de insertMany() . Os parâmetros são exatamente os mesmos, então você pode usá-lo como um substituto imediato e tudo deve funcionar bem (bem, o valor de retorno é um pouco diferente, mas você provavelmente não o está usando de qualquer maneira).

Referência

  • Documentação do Mongo
  • Aaron Heckman nos Grupos do Google discutindo inserções em massa