迭代通过所有集合并删除它们

问题描述:

我有这样的代码:迭代通过所有集合并删除它们

exports.cleanDB = function() { 
    return mongoose.connection.db.dropDatabase(); 
}; 

自认为是医疗事故,我想通过所有集合迭代,并要拨打

mongoose.connection.db.DateTime.remove(); 
上每出现一个

有人可以帮助我与该返回语句一起创建代码吗?

在应用类似的代码,我不知道如何重写的另一部分:

exports.cleanDB = function*(req) { 

    yield mongoose.connection.db.dropDatabase(); 
+0

*“由于这是不当行为”* - 是吗?谁说?除了目前没有任何东西(内置方法触发)以支持将集合选项添加到集合或类似对象之外,是否还存在其他问题?那为什么你认为你不能那样做? –

+0

在我们的例子中,删除这样的数据库会导致重复键错误(11000)。 – nottinhill

实在看不出有什么不对删除数据库。但如果你真的需要,那么你可以循环注册模型,并做一个.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