Mongoose.js: удалить коллекцию или базу данных

Можно ли удалить коллекцию или весь db с помощью mongoose.js?

Ответ 1

Да, хотя вы делаете это через собственный драйвер MongoDB, а не сам Mongoose. Предполагая требуемую, связанную переменную mongoose, собственный Db объект доступен через mongoose.connection.db, и этот объект предоставляет dropCollection и 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) {...});

Ответ 3

Для тех, кто использует тестовый фреймворк mochajs и хочет очистить все коллекции БД после каждого теста, вы можете использовать следующее, использующее async/await:

afterEach(async function () {
  const collections = await mongoose.connection.db.collections()

  for (let collection of collections) {
    await collection.remove()
  }
})

Ответ 4

Мангуст ссылается на связь на каждой модели. Поэтому может оказаться полезным также удалить БД или коллекцию отдельной модели.

Например:

// Drop the 'foo' collection from the current database
User.db.dropCollection('foo', function(err, result) {...});

// Drop the current database
User.db.dropDatabase(function(err, result) {...});

Ответ 5

В Mongoose 4.9.8 вы можете использовать ниже, чтобы удалить коллекцию, связанную с моделью.

ModelName.remove({}, function(err, row) {
  if (err) {
      console.log("Collection couldn't be removed" + err);
      return;
  }

  console.log("collection removed");
}) 

Ответ 6

Для версии 5.2.15 Mongoose + Mocha тестирует использование, где вам нужно отбросить все коллекции перед каждым тестом.

beforeEach(async () => {
     const collections = await mongoose.connection.db.collections();

     for (let collection of collections) {
          // note: collection.remove() has been depreceated.        
          await collection.deleteOne(); 
     }
});

Ответ 7

Если вы хотите отбросить сбор после тестов, и ваш тест выполнялся в 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()
})