Estou preparando um script de criação de banco de dados em Node.js e Mongoose. Como posso verificar se o banco de dados já existe e, em caso afirmativo, descartá-lo (excluí-lo) usando o Mongoose?
Não consegui encontrar uma maneira de largá-lo com o Mongoose.
Respostas:
Não existe um método para retirar uma coleção do mangusto, o melhor que você pode fazer é remover o conteúdo de uma:
Mas há uma maneira de acessar o driver javascript nativo mongodb, que pode ser usado para isso
Aviso
Faça um backup antes de tentar, caso algo dê errado!
fonte
O Mongoose criará um banco de dados, se ainda não houver um na conexão, portanto, depois de fazer a conexão, você pode apenas consultá-lo para ver se há algo nele.
Você pode descartar qualquer banco de dados ao qual esteja conectado:
fonte
mongoose.connection.db.dropDatabase()
mas descobri que o db ainda está lá? Eu sinto falta de alguma coisa?dropDatabase
invocação deveria ser colocada no retorno de chamada deconnect
, asmongoose.connect('...', function() { ...dropDatabase()})
.mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function(err, result) { if (err) { console.log(err); } done(); });
Se você modificar a solução de @hellslam assim, ela funcionará
Eu uso esta técnica para descartar o banco de dados após meus testes de integração
HTH pelo menos funcionou para mim, então decidi compartilhar =)
fonte
db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
mongoose.connect
realmente retornamongoose
. Em vez deconn = mongoose.connect(...)
escrevermongoose.connect(...)
e entãoconn = mongooose.connection
.connect
é assíncrono. Portanto, se a conexão não acontecer imediatamente, o comando dropDatabase () falhará. É por isso que as outras soluções acima recomendaram colocar odropDatabase
comando no retorno de chamada para aconnect
instrução ou umopen
manipulador de eventos.Tentei as respostas de @hellslam e @ silverfighter. Encontrei uma condição de corrida impedindo meus testes. No meu caso estou executando testes mocha e na função before do teste quero apagar todo o banco de dados. Aqui está o que funciona para mim.
Você pode ler mais https://github.com/Automattic/mongoose/issues/1469
fonte
Uma resposta atualizada, para 4.6.0+, se você tiver uma preferência por promessas ( consulte os documentos ):
Testei esse código em meu próprio código, usando o mongoose 4.13.6. Além disso, observe o uso da
useMongoClient
opção ( consulte os documentos ). Documentos indicam:fonte
A dificuldade que tive com as outras soluções é que elas precisam reiniciar o aplicativo se você quiser que os índices funcionem novamente.
Para minhas necessidades (ou seja, ser capaz de executar um teste de unidade nos nukes de todas as coleções e, em seguida, recriá-los junto com seus índices), acabei implementando esta solução:
Isso se baseia nas bibliotecas underscore.js e async.js para montar os índices em paralelo, ele poderia ser desfeito se você for contra essa biblioteca, mas deixo isso como um exercício para o desenvolvedor.
fonte
Para esvaziar uma coleção específica em um banco de dados:
Nota:
fonte
Isso funciona para mim a partir do Mongoose
v4.7.0
:fonte
A melhor maneira de eliminar seu banco de dados no Mongoose depende de qual versão do Mongoose você está usando. Se você estiver usando uma versão do Mongoose 4.6.4 ou mais recente, este método adicionado nessa versão provavelmente funcionará bem para você:
Em versões mais antigas, esse método não existia. Em vez disso, você deveria usar uma chamada direta do MongoDB:
No entanto, se for executado logo após a criação da conexão com o banco de dados, pode ocorrer uma falha silenciosa. Isso está relacionado ao fato de a conexão ser realmente assíncrona e não ter sido configurada ainda quando o comando ocorrer. Normalmente, isso não é um problema para outras chamadas do Mongoose, como
.find()
, que ficam na fila até que a conexão seja aberta e depois executada.Se você olhar o código-fonte do
dropDatabase()
atalho que foi adicionado, verá que ele foi projetado para resolver exatamente esse problema. Ele verifica se a conexão está aberta e pronta. Nesse caso, ele dispara o comando imediatamente. Caso contrário, ele registra o comando a ser executado quando a conexão com o banco de dados for aberta.Algumas das sugestões acima recomendam sempre colocar seu
dropDatabase
comando noopen
manipulador. Mas isso só funciona no caso em que a conexão ainda não está aberta.Esta é uma versão simples da lógica acima que pode ser usada com versões anteriores do Mongoose:
fonte
Mongoose 4.6.0+:
Passar uma chamada de retorno para se conectar não funcionará mais:
TypeError: Não é possível ler a propriedade 'commandsTakeWriteConcern' de null
fonte
connect
retorna uma promessa, para que você possa adicioná.then((connection) => { ... });
-la aomongoose.connect
. Consulte: mongoosejs.com/docs/connections.htmlfonte
Como o método remove é depreciado na biblioteca mongoose, podemos usar a função deleteMany sem parâmetros passados.
Isso excluirá todo o conteúdo deste modelo específico e sua coleção ficará vazia.
fonte
Para soltar todos os documentos em uma coleção:
Esta resposta é baseada no arquivo mongoose index.d.ts:
fonte
Para descartar todos os documentos em uma coleção:
como visto nos testes
fonte