迭代通过所有集合并删除它们
问题描述:
我有这样的代码:迭代通过所有集合并删除它们
exports.cleanDB = function() {
return mongoose.connection.db.dropDatabase();
};
自认为是医疗事故,我想通过所有集合迭代,并要拨打
mongoose.connection.db.DateTime.remove();
上每出现一个
。
有人可以帮助我与该返回语句一起创建代码吗?
在应用类似的代码,我不知道如何重写的另一部分:
exports.cleanDB = function*(req) {
yield mongoose.connection.db.dropDatabase();
答
实在看不出有什么不对删除数据库。但如果你真的需要,那么你可以循环注册模型,并做一个.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
(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)
}
})()
或纯承诺的.collections()
方法:如果该模型被注册与否
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
对象而不是只是'名称'。
+0
非常感谢。如前所述,在测试过程中经常会丢失很多DB,导致重复键错误。这就是为什么我想试试这个。你如何将最后的解决方案包装到收益率中? – nottinhill
*“由于这是不当行为”* - 是吗?谁说?除了目前没有任何东西(内置方法触发)以支持将集合选项添加到集合或类似对象之外,是否还存在其他问题?那为什么你认为你不能那样做? –
在我们的例子中,删除这样的数据库会导致重复键错误(11000)。 – nottinhill