Mongoose.js:删除集合或数据库

是否可以使用mongoose.js删除集合或整个数据库?

WHITECOLOR asked 2020-08-03T07:23:40Z
6个解决方案
66 votes

是的,尽管您是通过本机MongoDB驱动程序而非Mongoose本身完成的。 假设需要一个已连接的dropDatabase变量,则可以通过mongoose.connection.db访问本机dropDatabase对象,并且该对象提供了dropDatabasedropDatabase方法。

// 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) {...});
JohnnyHK answered 2020-08-03T07:23:56Z
50 votes

现在可以在猫鼬中完成。

MyModel.collection.drop();

帽子提示:[https://github.com/Automattic/mongoose/issues/4511]

David L. Walsh answered 2020-08-03T07:24:21Z
7 votes

对于那些正在使用mochajs测试框架并希望在每次测试后清除所有数据库集合的数据库,可以使用以下使用async / await的方法:

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

  for (let collection of collections) {
    await collection.remove()
  }
})
adamc answered 2020-08-03T07:24:41Z
1 votes

猫鼬在每个模型上都引用了该连接。 因此,您可能会发现将数据库或集合从单个模型中删除也很有用。

例如:

// 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) {...});
Huston Hedinger answered 2020-08-03T07:25:05Z
0 votes

对于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(); 
     }
});
Durja Arai answered 2020-08-03T07:25:26Z
0 votes

如果要在测试后丢弃集合,并且您的测试在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()
})
Vitaliy Andrusishyn answered 2020-08-03T07:25:46Z
translate from https://stackoverflow.com:/questions/11453617/mongoose-js-remove-collection-or-db