web-dev-qa-db-fra.com

Mongoose.js: supprimer une collection ou une base de données

Est-il possible de supprimer une collection ou une base de données entière en utilisant mongoose.js?

40
WHITECOLOR

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) {...});
63
JohnnyHK

Cela peut maintenant être fait dans Mongoose.

MyModel.collection.drop();

Astuce chapeau: https://github.com/Automattic/mongoose/issues/4511

49
David L. Walsh

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()
  }
})
7
adamc

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) {...});
1
Huston Hedinger

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()
})
0
Vitaliy Andrusishyn

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(); 
     }
});
0
Durja Arai