O Mongoose v3.6 + suporta inserções em lote agora? Procurei por alguns minutos, mas qualquer coisa que corresponda a essa consulta tem alguns anos e a resposta foi um não inequívoco.
Editar:
Para referência futura, a resposta é usar Model.create()
. create()
aceita um array como seu primeiro argumento, então você pode passar seus documentos a serem inseridos como um array.
Respostas:
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. Vai ser muito lento . Nesse caso, você deve usarModel.collection.insert
, que tem um desempenho muito melhor . Dependendo do tamanho do bulk,Model.create()
vai até travar! Tentei com um milhão de documentos, sem sorte. Usá-Model.collection.insert
lo demorou apenas alguns segundos.docs
é a matriz de documentos a serem inseridos;options
é um objeto de configuração opcional - veja a documentaçãocallback(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 , este método irá ignorar qualquer procedimento de validação e acessar o driver Mongo diretamente. É uma troca que você tem que fazer, já que está lidando com uma grande quantidade de dados, caso contrário, você não seria capaz de inseri-los em seu banco de dados (lembre-se de que estamos falando de centenas de milhares de documentos aqui).
Um exemplo simples
Atualização 22/06/2019 : embora
insert()
ainda possa ser usado sem problemas, ele foi substituído porinsertMany()
. Os parâmetros são exatamente os mesmos, então você pode apenas usá-lo como um substituto drop-in e tudo deve funcionar bem (bem, o valor de retorno é um pouco diferente, mas provavelmente você não o está usando de qualquer maneira).Referência
fonte
Model.collection
passa diretamente pelo driver do Mongo, você perde todas as coisas legais do mangusto, incluindo validação e ganchos. Apenas algo para ter em mente.Model.create
perde os ganchos, mas ainda passa pela validação. Se você quiser tudo, deve iterar enew MyModel()
Mongoose 4.4.0 agora suporta inserção em massa
O Mongoose 4.4.0 apresenta a inserção --true-- bulk com o método model
.insertMany()
. É muito mais rápido do que fazer um loop.create()
ou fornecer um array.Uso:
Ou
Você pode rastreá-lo em:
fonte
bulkWrite
? Veja aqui: stackoverflow.com/questions/38742475/…fatal error allocation failed
. Mas se eu usar collection.insert Funciona perfeitamente.dateCreated : { type: Date, default: Date.now },
Na verdade, você pode usar o método "criar" do Mongoose, ele pode conter uma série de documentos, veja este exemplo:
A função de retorno de chamada contém os documentos inseridos. Você nem sempre sabe quantos itens devem ser inseridos (comprimento de argumento fixo como acima) para que possa percorrê-los:
Atualização: uma solução melhor
Uma solução melhor seria usar em
Candy.collection.insert()
vez deCandy.create()
- usado no exemplo acima - porque é mais rápido (create()
chamaModel.save()
cada item, então é mais lento).Consulte a documentação do Mongo para obter mais informações: http://docs.mongodb.org/manual/reference/method/db.collection.insert/
(obrigado a arcseldon por apontar isso)
fonte
{type:'jellybean'}
vez de{type:'jelly bean'}
? Btw. que tipos estranhos são esses? Eles fazem parte da API Mongoose?type
geralmente é reservado no Mongoose para denominar o ADT de um objeto de banco de dados.Você pode realizar a inserção em massa usando o shell mongoDB, inserindo os valores em uma matriz.
fonte
YourModel.collection.insert()
collection.insert
resposta bruta foi dada algumas semanas antes desta resposta e explicada com muito mais detalhes.Você pode realizar a inserção em massa usando o mangusto, como a resposta de maior pontuação. Mas o exemplo não pode funcionar, deveria ser:
Não use uma instância de esquema para a inserção em massa, você deve usar um objeto de mapa simples.
fonte
Aqui estão as duas maneiras de salvar dados com insertMany e salvar
1) Mongoose salvar matriz de documentos com
insertMany
em massa2) Mongoose salvar matriz de documentos com
.save()
Esses documentos serão salvos paralelamente.
fonte
Parece que usando o mangusto há um limite de mais de 1000 documentos, ao usar
Você pode usar:
Mas isso é quase duas vezes mais rápido ao testar com 10.000 documentos:
fonte
Compartilhando código funcional e relevante de nosso projeto:
fonte
.insertMany
solução já foi dada (e explicada) nesta resposta de 2016 .