如何用Mongoose删除数据库?
我正在准备Node.js和Mongoose中的数据库创build脚本。 我如何检查数据库是否已经存在,如果是的话,使用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会创build一个数据库(如果连接上不存在的话),所以一旦build立了连接,你可以查询它是否有任何内容。
你可以删除你连接的任何数据库:
var mongoose = require('mongoose'); /* Connect to the DB */ mongoose.connect('mongodb://localhost/mydatabase',function(){ /* Drop the DB */ mongoose.connection.db.dropDatabase(); });
如果你像这样修改@ hellslam的解决scheme,那么它将工作
在我的集成testing之后,我使用这种技术来删除数据库
//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();
HTH至less对我来说是这样,所以我决定分享=)
试过@ hellslam和@ silverfighter的答案。 我发现了一个持续testing的竞赛状态。 在我的情况下,我正在运行摩卡testing,在testing的前function,我想擦除整个数据库。 这是对我有用的东西。
var con = mongoose.connect('mongodb://localhost/mydatabase'); mongoose.connection.on('open', function(){ con.connection.db.dropDatabase(function(err, result){ done(); }); });
与其他解决scheme相比,我们遇到的困难是,如果您想让索引重新运行,那么他们就需要重新启动应用程序。
为了我的需要(即能够运行一个unit testing核心所有的集合,然后重新创build它们的索引),我最终实现了这个解决scheme:
这依赖于underscore.js和async.js库在parellel中组装索引,如果您违反该库,则可能会解开这个索引,但我将其作为开发人员的练习者。
mongoose.connection.db.executeDbCommand( {dropDatabase:1}, function(err, result) { var mongoPath = mongoose.connections[0].host + ':' + mongoose.connections[0].port + '/' + mongoose.connections[0].name //Kill the current connection, then re-establish it mongoose.connection.close() mongoose.connect('mongodb://' + mongoPath, function(err){ var asyncFunctions = [] //Loop through all the known schemas, and execute an ensureIndex to make sure we're clean _.each(mongoose.connections[0].base.modelSchemas, function(schema, key) { asyncFunctions.push(function(cb){ mongoose.model(key, schema).ensureIndexes(function(){ return cb() }) }) }) async.parallel(asyncFunctions, function(err) { console.log('Done dumping all collections and recreating indexes') }) }) })
清空数据库中的特定集合:
model.remove(function(err, p){ if(err){ throw err; } else{ console.log('No Of Documents deleted:' + p); } });
注意:
- select一个引用特定模式的模型(您希望删除的集合模式)。
- 此操作不会从数据库中删除集合名称。
- 这将删除集合中的所有文档。
这对Mongoose v4.7.0
:
mongoose.connection.dropDatabase();
在Mongoose中放置数据库的最佳方式取决于您使用的Mongoose版本。 如果您使用的是1.6.4或更新版本的Mongoose,那么在该版本中添加的这个方法很可能对您有用:
mongoose.connection.dropDatabase();
在较旧的版本中,此方法不存在。 相反,你要使用一个直接的MongoDB调用:
mongoose.connection.db.dropDatabase();
但是,如果在创build数据库连接后立即执行此操作,则可能会以静默方式失败。 这与连接实际上是asynchronous的,并且在命令发生时还没有build立起来有关。 对于像.find()
这样的其他Mongoose调用,这通常不是一个问题,直到连接打开然后运行才会排队。
如果您查看已添加的dropDatabase()
快捷方式的源代码,则可以看到它devise用于解决此确切问题。 它会检查连接是否打开并准备就绪。 如果是这样,它会立即启动命令。 如果不是,则在数据库连接打开时注册要运行的命令。
以上build议中的一些build议始终将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();
如在testing中看到的那样
mongoose4.6.0+:
mongoose.connect('mongodb://localhost/mydb') mongoose.connection.once('connected', () => { mongoose.connection.db.dropDatabase(); });
通过callback连接将不再工作:
TypeError:无法读取null的属性'commandsTakeWriteConcern'