Можно ли удалить коллекцию или весь db с помощью mongoose.js?
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) {...});
Ответ 2
Теперь это можно сделать в Mongoose.
MyModel.collection.drop();
Совет шляпы: https://github.com/Automattic/mongoose/issues/4511
Ответ 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()
})