Est-il possible de supprimer une collection ou une base de données entière en utilisant mongoose.js?
Oui, bien que vous le fassiez via le pilote natif MongoDB et non Mongoose lui-même. En supposant une variable mongoose
requise et connectée, l'objet natif Db
est accessible via mongoose.connection.db
, et cet objet fournit les méthodes dropCollection
et dropDatabase
.
// Drop the 'foo' collection from the current database
mongoose.connection.db.dropCollection('foo', function(err, result) {...});
// Drop the current database
mongoose.connection.db.dropDatabase(function(err, result) {...});
Cela peut maintenant être fait dans Mongoose.
MyModel.collection.drop();
Astuce chapeau: https://github.com/Automattic/mongoose/issues/4511
Pour ceux qui utilisent le framework de test mochajs et qui souhaitent nettoyer toutes les collections db après chaque test, vous pouvez utiliser ce qui suit qui utilise async/wait:
afterEach(async function () {
const collections = await mongoose.connection.db.collections()
for (let collection of collections) {
await collection.remove()
}
})
Mongoose référence la connexion sur chaque modèle. Il peut donc être utile de supprimer également la base de données ou la collection d'un modèle individuel.
Par exemple:
// Drop the 'foo' collection from the current database
User.db.db.dropCollection('foo', function(err, result) {...});
// Drop the current database
User.db.db.dropDatabase(function(err, result) {...});
Si vous souhaitez supprimer la collecte après les tests et que votre test s'exécutait dans un conteneur docker
:
mongoose = require("mongoose");
...
afterAll(async () => {
const url = 'mongodb://Host.docker.internal:27017/my-base-name';
await mongoose.connect(url)
await mongoose.connection.collection('collection-name').drop()
})
Pour la version 5.2.15 de Mongoose + Mocha, l'utilisation des tests nécessite de supprimer toutes les collections avant chaque test.
beforeEach(async () => {
const collections = await mongoose.connection.db.collections();
for (let collection of collections) {
// note: collection.remove() has been depreceated.
await collection.deleteOne();
}
});