Node.js 如何使用Mongoose删除数据库?

Node.js 如何使用Mongoose删除数据库?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在Node.js和Mongoose中准备一个数据库创建脚本。 如何检查数据库是否已经存在,如果已经存在,如何使用Mongoose删除 我找不到使用Mongoose删除它的方法。没有从Mongoose删除集合的方法,您最好删除其中一个集合的内容: Model.remove({}, function(err) { console.log('collection removed') }); 但是有一种方法可以访问mongodb本机javascript驱动程序,它可以用于此目的 mong

我正在Node.js和Mongoose中准备一个数据库创建脚本。 如何检查数据库是否已经存在,如果已经存在,如何使用Mongoose删除


我找不到使用Mongoose删除它的方法。

没有从Mongoose删除集合的方法,您最好删除其中一个集合的内容:

Model.remove({}, function(err) { 
   console.log('collection removed') 
});
但是有一种方法可以访问mongodb本机javascript驱动程序,它可以用于此目的

mongoose.connection.collections['collectionName'].drop( function(err) {
    console.log('collection dropped');
});
警告
在尝试之前做一个备份,以防出错

Mongoose将创建一个数据库,如果连接上还没有数据库,那么一旦建立了连接,您就可以查询它,看看其中是否有任何内容

您可以删除连接到的任何数据库:

var mongoose = require('mongoose');
/* Connect to the DB */
mongoose.connect('mongodb://localhost/mydatabase',function(){
    /* Drop the DB */
    mongoose.connection.db.dropDatabase();
});

如果您像这样修改@hellslam的解决方案,那么它将起作用

我使用这种技术在集成测试之后删除数据库

//CoffeeScript
mongoose = require "mongoose"
conn = mongoose.connect("mongodb://localhost/mydb")

conn.connection.db.dropDatabase()

//JavaScript
var conn, mongoose;
mongoose = require("mongoose");
conn = mongoose.connect("mongodb://localhost/mydb");

conn.connection.db.dropDatabase();

至少对我来说是这样,所以我决定分享=)

其他解决方案的困难在于,如果你想让索引重新工作,它们依赖于重新启动应用程序

出于我的需要(即能够对nukes所有集合运行单元测试,然后重新创建它们及其索引),我最终实现了以下解决方案:

这依赖于和库在parellel中组装索引,如果您反对该库,它可能会被解开,但我将其留给开发人员作为练习


要清空数据库中的特定集合:

model.remove(function(err, p){
    if(err){ 
        throw err;
    } else{
        console.log('No Of Documents deleted:' + p);
    }
});
注:

  • 选择引用特定架构(集合架构)的模型 您希望删除)
  • 此操作不会删除集合名称 从数据库
  • 这将删除集合中的所有文档

  • 尝试了@hellslam和@silverfighter的答案。我发现比赛条件阻碍了我的测试。在我的例子中,我正在运行mocha测试,在测试的before函数中,我想擦除整个DB。这是对我有用的

    var con = mongoose.connect('mongodb://localhost/mydatabase');
    mongoose.connection.on('open', function(){
        con.connection.db.dropDatabase(function(err, result){
            done();
        });
    });
    

    您可以阅读更多内容

    从Mongoose
    v4.7.0开始,这对我很有用:

    mongoose.connection.dropDatabase();
    

    在Mongoose中删除数据库的最佳方法取决于您使用的Mongoose版本。如果您使用的是4.6.4或更高版本的Mongoose,那么在该版本中添加的此方法可能会很好地适用于您:

    mongoose.connection.dropDatabase();
    
    在旧版本中,此方法不存在。相反,您要使用直接MongoDB调用:

    mongoose.connection.db.dropDatabase();
    
    但是,如果在创建数据库连接后立即运行此操作,则可能会在静默状态下失败。这与连接有关,连接实际上是异步的,并且在命令执行时尚未设置。对于其他Mongoose调用,如
    .find()
    ,这通常不是问题,它排队等待连接打开,然后运行

    如果您查看添加的
    dropDatabase()
    快捷方式的源代码,您会发现它就是为了解决这个问题而设计的。它检查连接是否打开并准备就绪。如果是这样,它会立即触发命令。如果没有,它将注册在数据库连接打开时运行的命令

    上面的一些建议建议始终将
    dropDatabase
    命令放在
    open
    处理程序中。但这只适用于连接尚未打开的情况

    Connection.prototype.dropDatabase = function(callback) {
      var Promise = PromiseProvider.get();
      var _this = this;
      var promise = new Promise.ES6(function(resolve, reject) {
        if (_this.readyState !== STATES.connected) {
          _this.on('open', function() {
            _this.db.dropDatabase(function(error) {
              if (error) {
                reject(error);
              } else {
                resolve();
              }
            });
          });
        } else {
          _this.db.dropDatabase(function(error) {
            if (error) {
              reject(error);
            } else {
              resolve();
            }
          });
        }
      });
      if (callback) {
        promise.then(function() { callback(); }, callback);
      }
      return promise;
    };
    
    以下是上述逻辑的一个简单版本,可用于早期Mongoose版本:

    // This shim is backported from Mongoose 4.6.4 to reliably drop a database
    // http://stackoverflow.com/a/42860208/254318
    // The first arg should be "mongoose.connection"
    function dropDatabase (connection, callback) {
        // readyState 1 === 'connected'
        if (connection.readyState !== 1) {
          connection.on('open', function() {
            connection.db.dropDatabase(callback);
          });
        } else {
          connection.db.dropDatabase(callback);
        }
    }  
    

    用于删除集合中的所有文档:

    myMongooseModel.collection.drop();
    
    await mongoose.connection.db.dropDatabase();
    
    如猫鼬4.6.0+中所示:

    mongoose.connect('mongodb://localhost/mydb')
    mongoose.connection.once('connected', () => {
        mongoose.connection.db.dropDatabase();
    });
    
    将回调传递给connect将不再起作用:


    TypeError:如果您喜欢Promissions(),则无法读取4.6.0+的null属性“commandsTakeWriteConcern”的更新答案:

    我使用Mongoose4.13.6在自己的代码中测试了这段代码。另外,请注意
    useMongoClient
    选项()的使用。文件表明:

    从4.11.0开始,Mongoose的默认连接逻辑已被弃用。请使用useMongoClient选项选择新的连接逻辑,但如果要升级现有代码库,请确保首先测试连接


    由于remove方法在mongoose库中被降级,因此我们可以使用deleteMany函数,而不需要传递任何参数

    Model.deleteMany();
    

    这将删除此特定模型的所有内容,并且您的集合将为空

    要删除集合中的所有文档:

    myMongooseModel.collection.drop();
    
    await mongoose.connection.db.dropDatabase();
    
    此答案基于mongoose index.d.ts文件:

    dropDatabase(): Promise<any>;
    
    dropDatabase():Promise;
    
    要删除完整的数据库,只需传递名称。。。 这个版本在4.4版的2020更新版上运行得非常好

    创建一个名为drop.js的新文件,即 放进去

    require('dotenv').config()
    const url = process.env.ATLAS_URI;
    mongoose.connect(url, {
      useNewUrlParser: true,
      useCreateIndex: true,
      useUnifiedTopology: true,
      useFindAndModify: false
    });
    
    const connection = mongoose.connection;
    connection.once('open', () => {
      console.log("MongoDB database connection established successfully");
    })
    
    
    mongoose.connection.dropDatabase().then(
      async() => {
       
        try {
          mongoose.connection.close()
         
        }
        catch (err) {
          console.log(err)
        }
    
     }
      
    );
    
    在您的package.json中

    in your package.json 
     "scripts": {
        
        "drop": "node models/drop.js",
       
      }
    

    在您的控制台上运行它,

    当我尝试第二个选项时,我得到“无法读取未定义的属性'collectionName',因为所有集合都在哈希mongoose.connection.collections中,您可以简单地为(mongoose.connection.collections中的集合){mongoose.connection.collections[collection].drop}列出它们。。。smth Similar您有一个输入错误——在函数(err)后面有一个额外的逗号。。。应该是:mongoose.connection.collections['collectionName'].drop(函数(err){console.log('collection droped');});我是唯一一个意识到这个答案没有解决如何删除数据库的问题的人。它不是要求删除一个集合,而是要求删除一个数据库。“没有从mongoose删除集合的方法”,首先OP想要删除一个数据库,而不是一个集合,其次下面@hellslam的答案很好。我尝试了
    mongoose.connection.db.dropDatabase()
    ,但我发现数据库仍然存在?我错过了什么吗?如果你以后连接到它,它会被重新创建,尽管是空的。在您删除它之后,其中是否有任何集合?您是在整个过程中使用相同的连接,还是创建了多个连接?我发现
    dropDatabase
    调用应该放在callb中
    require('dotenv').config()
    const url = process.env.ATLAS_URI;
    mongoose.connect(url, {
      useNewUrlParser: true,
      useCreateIndex: true,
      useUnifiedTopology: true,
      useFindAndModify: false
    });
    
    const connection = mongoose.connection;
    connection.once('open', () => {
      console.log("MongoDB database connection established successfully");
    })
    
    
    mongoose.connection.dropDatabase().then(
      async() => {
       
        try {
          mongoose.connection.close()
         
        }
        catch (err) {
          console.log(err)
        }
    
     }
      
    );
    
    in your package.json 
     "scripts": {
        
        "drop": "node models/drop.js",
       
      }