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

Mongoose.js:删除集合或数据库,mongoose,Mongoose,是否可以使用mongoose.js删除集合或整个数据库?可以,尽管您是通过本机MongoDB驱动程序而不是mongoose本身来完成的。假设有一个必需的、已连接的mongoose变量,则可以通过mongoose.connection.db访问本机对象,该对象提供了 //从当前数据库中删除“foo”集合 mongoose.connection.db.dropCollection('foo',函数(err,result){…}); //删除当前数据库 mongoose.connection.db.d

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

可以,尽管您是通过本机MongoDB驱动程序而不是mongoose本身来完成的。假设有一个必需的、已连接的
mongoose
变量,则可以通过
mongoose.connection.db
访问本机对象,该对象提供了

//从当前数据库中删除“foo”集合
mongoose.connection.db.dropCollection('foo',函数(err,result){…});
//删除当前数据库
mongoose.connection.db.dropDatabase(函数(err,result){…});

Mongoose引用了每个型号上的连接。因此,您可能会发现删除单个模型的DB或集合也很有用

例如:

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

这可以在猫鼬身上实现

MyModel.collection.drop();

帽子提示:

对于使用测试框架并希望在每次测试后清理所有db集合的用户,可以使用以下使用async/await的方法:

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

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

对于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(); 
     }
});

如果要在测试之后删除集合,并且您的测试正在
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()
})

请注意,这些方法也会返回承诺,因此您可以执行类似
wait mongoose.connection.db.dropCollection('foo')有没有一种方法可以通过承诺做到这一点,而不是与回调抗争?@JohnK:
等待MyModel.collection.drop()。更有趣的问题是,如何仅在集合存在时删除?否则,您将得到一个误导性的、含糊不清的结果。@DanDascalescu您可以
捕获承诺返回的错误<代码>等待MyModel.collection.drop().然后(()=>{…}).catch(()=>{…})