【问题标题】:Mongoose.js: remove collection or DBMongoose.js:删除集合或数据库
【发布时间】:2025-11-25 09:40:01
【问题描述】:

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

【问题讨论】:

    标签: mongoose


    【解决方案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 引用每个模型上的连接。因此,您可能会发现从单个模型中删除数据库或集合很有用。

    例如:

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

    【讨论】:

      【解决方案3】:

      现在可以在 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(() => { ... })
      【解决方案4】:

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

      afterEach(async function () {
        const collections = await mongoose.connection.db.collections()
      
        for (let collection of collections) {
          await collection.remove()
        }
      })
      

      【讨论】:

        【解决方案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);
          

          【讨论】: