實在看不出有什麼不對刪除數據庫。但如果你真的需要,那麼你可以循環註冊模型,並做一個.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
對象而不是隻是'名稱'。
*「由於這是不當行爲」* - 是嗎?誰說?除了目前沒有任何東西(內置方法觸發)以支持將集合選項添加到集合或類似對象之外,是否還存在其他問題?那爲什麼你認爲你不能那樣做? –
在我們的例子中,刪除這樣的數據庫會導致重複鍵錯誤(11000)。 – nottinhill