我有这段代码:
exports.cleanDB = function() {
return mongoose.connection.db.dropDatabase();
};
由于这是一种弊端,我想迭代所有集合并想要调用
mongoose.connection.db.DateTime.remove();
每一个。
有人可以帮我创建代码和return语句吗?
在应用程序的另一部分类似代码,我不知道如何重写:
exports.cleanDB = function*(req) {
yield mongoose.connection.db.dropDatabase();
答案 0 :(得分:3)
真的没有看到删除数据库有什么问题。但是,如果你真的必须那么你可以循环注册的模型并做.remove()
。
例如:
// Just similating an async wrapper
(async function() {
try {
const conn = await mongoose.connect(uri,options);
// Loop all registered models
await Promise.all(
Object.entries(conn.models).map(([k,m]) => m.remove())
)
} catch(e) {
console.error(e)
}
})()
或简单的承诺:
mongoose.connect(uri,options).then( conn => {
Promise.all(
Object.entries(conn.models).map(([k,m]) => m.remove())
).then( () => /* something */ )
})
如果您不支持Object.keys
Object.entries()
mongoose.connect(uri,options).then( conn => {
Promise.all(
Object.keys(conn.models).map(k => conn.models[k].remove())
).then( () => /* something */ )
})
或者如果你真的必须,那么深入了解数据库级别并使用Db
.collections()
方法擦除所有集合
(async function() {
try {
const conn = await mongoose.connect(uri,options);
// Get every collection in an array
await Promise.all(
(await conn.db.collections()).map( c => c.remove() )
);
} catch(e) {
console.error(e)
}
})()
或简单的承诺:
mongoose.connect(uri,options).then( conn => {
conn.db.collections()
.then( collections => Promise.all(
collections.map( c => c.remove() )
)
.then( () => /* something */ )
})
如果模型是否已注册,则无关紧要。
所以它实际上取决于您更愿意采用哪种方法,如果您已经处理过加载和注册每个模型的代码,那么使用已注册的模型就足够了。否则使用直接驱动程序方法来获取对数据库中当前所有集合的引用,确保即使模型尚未注册,它的集合仍然会删除所有内容。
请注意,Db.collections()
基本上是Db.listCollections()
输出的包装版本,它实际上是返回Collection
个对象,而不仅仅是'名称'。