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

Posted

技术标签:

【中文标题】Mongoose.js:删除集合或数据库【英文标题】:Mongoose.js: remove collection or DB 【发布时间】:2012-07-12 07:24:15 【问题描述】:

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

【问题讨论】:

【参考方案1】:

是的,尽管您通过本机 MongoDB 驱动程序而不是 Mongoose 本身来执行此操作。假设一个必需的、已连接的mongoose 变量,则可以通过mongoose.connection.db 访问本机Db 对象,并且该对象提供dropCollectiondropDatabase 方法。

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

【讨论】:

请注意,这些方法也会返回 Promise,因此您可以执行 await mongoose.connection.db.dropCollection('foo'); 之类的操作,而不必为回调而苦苦挣扎【参考方案2】:

现在可以在 Mongoose 中完成。

MyModel.collection.drop();

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

【讨论】:

有没有办法通过 promises 做到这一点? @JohnK:await MyModel.collection.drop();。更有趣的问题是,如何仅在集合存在时才丢弃?否则,你会得到一个误导性和神秘的MongoError: ns not found @DanDascalescu 你可以catch 承诺返回的错误。 await MyModel.collection.drop().then(() => ... ).catch(() => ... )【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

Mongoose 引用每个模型上的连接。因此,您可能会发现从单个模型中删除数据库或集合很有用。

例如:

// 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】:

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

【讨论】:

删除集合 before 执行而不是在测试运行之间中断执行或数据库中已经存在手动测试的数据之后更安全。【参考方案6】:

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

【讨论】:

【参考方案7】:

我使用Connection.prototype.dropCollection()删除了我的收藏

const conn = mongoose.createConnection('mongodb://localhost:27017/mydb');
conn.dropCollection("Collection_name",callbacks);

【讨论】:

以上是关于Mongoose.js:删除集合或数据库的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 Mongoose.js 按嵌套数组中的字段排序

Mongoose.js 条件填充

Mongoose.js:如何实现创建或更新?

Mongoose.js:如何实现创建或更新?

为啥使用 Mongoose JS 删除嵌入式子文档数组的元素不起作用?