2017-10-20 99 views
0

我有這樣的代碼:迭代通過所有集合並刪除它們

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

回答

2

實在看不出有什麼不對刪除數據庫。但如果你真的需要,那麼你可以循環註冊模型,並做一個.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

相關問題