2017-10-20 3 views
0

Je possède ce code:Itérer à travers toutes les collections et les supprimer

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

Depuis c'est la faute professionnelle, je veux itérer toutes les collections et que vous voulez appeler

mongoose.connection.db.DateTime.remove(); 

sur chacun il.

Quelqu'un peut-il m'aider à créer le code avec cette déclaration de retour?

Sur une autre partie de l'application du code similaire où je ne sais pas comment récrire:

exports.cleanDB = function*(req) { 

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

* "Comme c'est une faute professionnelle" * - Est-ce? Qui dit? Y a-t-il un problème avec cette autre chose qu'il n'y a actuellement rien (méthode intégrée qui est déclenchée) pour supporter l'ajout d'options de collation à une collection ou similaire? Alors pourquoi tu crois que tu ne peux pas faire ça? –

+0

Suppression des bases de données comme cela entraîne des erreurs de clé en double (11000) dans notre cas. – nottinhill

Répondre

2

ne vois vraiment pas ce qui ne va pas laisser tomber avec la base de données. Mais si vous devez vraiment alors vous pouvez simplement boucler les modèles enregistrés et faire un .remove().

Par exemple:

// 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) 
    } 

})() 

Ou promesses simples:

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

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

}) 

Vous pouvez même faire Object.keys si vous ne disposez pas de support pour Object.entries()

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

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

}) 

Ou si vous avez vraiment doit, puis creuser dans le niveau de base de données et effacer toutes les collections en utilisant la méthode .collections() de 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) 
    } 

})() 

Ou simples promesses:

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

    conn.db.collections() 
    .then(collections => Promise.all( 
     collections.map(c => c.remove()) 
    ) 
    .then(() => /* something */) 

}) 

Et ce ne serait pas grave si le modèle a été enregistré ou non.

Donc, cela dépend vraiment de l'approche que vous préférez prendre, et si vous avez déjà du code qui aurait dû traiter pour charger et enregistrer chaque modèle, alors utiliser les modèles enregistrés devrait être suffisant. Sinon, l'utilisation de la méthode du pilote direct pour récupérer des références à toutes les collections présentes dans la base de données garantit que même si le modèle n'a pas encore été enregistré, son contenu est toujours supprimé.

Notez que Db.collections() est fondamentalement une version encapsulée de la sortie de Db.listCollections() qui renvoie en réalité Collection objets au lieu de simplement les 'noms'.

+0

Merci beaucoup pour cela. Comme nous l'avons dit, la perte de DB plusieurs fois pendant les tests entraîne des erreurs de clé en double. C'est pourquoi je veux essayer ça. Comment emballeriez-vous la dernière solution dans un rendement? – nottinhill