Nœud.js-Mongoose-vérifier l'existence D'une collection

j'ai besoin d'insérer quelques données en utilisant mongoose mais le nom de la collection est fourni par l'utilisateur au moment de l'insertion, donc je dois d'abord vérifier si la collection existe.

la façon dont je sais comment vérifier si une collection existe est en questionnant le system.namespaces de la collection. Je peux voir 3 approches possibles pour faire cela.

  1. trouver un moyen d'interroger system.namespaces en utilisant mongoose (peut-être en définissant un schéma qui correspond à celui de la base de données).
  2. obtenir certains noeud sous-jacent-mongodb - objet natif de mongoose et l'exécution de la requête manuellement. En tout cas, c'est quelque chose que j'aimerais apprendre à faire.
  3. en utilisant une instance séparée d'un noeud-mongodb-natif (ou un autre pilote) pour effectuer la requête

3 est le moins élégant et celui que j'essaie d'éviter, Je ne veux pas charger une autre instance du pilote ni créer une nouvelle connexion lorsque mongoose déjà créé un.

je vais essayer 1 après avoir écrit cela. Je viens de vérifier system.namespaces et le schéma semble assez simple

j'aimerais encore entendre quelques opinions.

Merci!

21
demandé sur Juan Campa 2012-11-19 01:37:02

3 réponses

L'Option 2 est probablement la plus propre. En supposant que vous ayez une mangouste!--2--> objet conn qui a été ouvert en utilisant mongoose.createConnection, vous pouvez accéder au mongo natif Db objet conn.db. De là, vous pouvez appeler collectionNames qui doit fournir ce que vous êtes à la recherche de:

conn.db.collectionNames(function (err, names) {
    // names contains an array of objects that contain the collection names
});

vous pouvez aussi passer un nom de collection comme paramètre à collectionNames pour filtrer les résultats pour juste ce que vous cherchez.

Mangouste 4.x Mise à jour

dans le 2.version x du pilote natif MongoDB que Mongoose 4.x utilise, collectionNames a été remplacé par listCollections qui accepte un filtre et renvoie un curseur pour que vous fassiez ceci comme:

mongoose.connection.db.listCollections({name: 'mycollectionname'})
    .next(function(err, collinfo) {
        if (collinfo) {
            // The collection exists
        }
    });
31
répondu JohnnyHK 2015-04-06 03:46:40

Cela fonctionne pour moi (mangouste version 5.1.1):

const mongoose = require('mongoose');
const mongoURI = 'mongodb://localhost:27017/mydb'
// notice the mongoose.createConnection instead of mongoose.connect
const conn = mongoose.createConnection(mongoURI);
conn.on('open', function () {
    conn.db.listCollections().toArray(function (err, collectionNames) {
      if (err) {
        console.log(err);
        return;
      }
        console.log(collectionNames);
        conn.close();
    });
});
0
répondu V. Lipunov 2018-06-22 01:40:22

trouver collection dans la liste de collection

public function CollectionExists($collectionName)
    {
        $mongo = new Mongo();
        $collectionArr = $mongo->selectDB('yourrec')->listCollections();
        if (in_array($collectionName, $collectionArr)) {
            return true;
        }
        return false;
    }
-8
répondu user1947323 2013-02-25 09:46:03