Node.js 如何使用Mongoose删除数据库?
我正在Node.js和Mongoose中准备一个数据库创建脚本。 如何检查数据库是否已经存在,如果已经存在,如何使用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
我找不到使用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",
}