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 documentoscallback(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