2017-10-20 7 views
0

を削除するには、私はこのコードを持っています。すべてのコレクションを反復処理し、それらを

return文と一緒にコードを作成するのに誰か助けてもらえますか?

私はリライトする方法がわからないアプリなコードの別の部分で:

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.entries()

mongoose.connect(uri,options).then(conn => { 

    Promise.all(
    Object.keys(conn.models).map(k => conn.models[k].remove()) 
).then(() => /* something */) 

}) 

それとも本当にあなたの場合をサポートしていない場合でもObject.keysを行うことができますデータベースレベルを掘り下げ、すべてのコレクションをワイプします。 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

関連する問題