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ê:
mongoose.connection.dropDatabase();
Em versões mais antigas, esse método não existia. Em vez disso, você deveria usar uma chamada direta do MongoDB:
mongoose.connection.db.dropDatabase();
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 no open
manipulador. Mas isso só funciona no caso em que a conexão ainda não está aberta.
Connection.prototype.dropDatabase = function(callback) {
var Promise = PromiseProvider.get();
var _this = this;
var promise = new Promise.ES6(function(resolve, reject) {
if (_this.readyState !== STATES.connected) {
_this.on('open', function() {
_this.db.dropDatabase(function(error) {
if (error) {
reject(error);
} else {
resolve();
}
});
});
} else {
_this.db.dropDatabase(function(error) {
if (error) {
reject(error);
} else {
resolve();
}
});
}
});
if (callback) {
promise.then(function() { callback(); }, callback);
}
return promise;
};
Esta é uma versão simples da lógica acima que pode ser usada com versões anteriores do Mongoose:
// This shim is backported from Mongoose 4.6.4 to reliably drop a database
// http://stackoverflow.com/a/42860208/254318
// The first arg should be "mongoose.connection"
function dropDatabase (connection, callback) {
// readyState 1 === 'connected'
if (connection.readyState !== 1) {
connection.on('open', function() {
connection.db.dropDatabase(callback);
});
} else {
connection.db.dropDatabase(callback);
}
}