web-dev-qa-db-fra.com

Comment vérifier si une collection existe dans le pilote de noeud natif Mongodb?

Je dois vérifier si une collection existe sur une certaine base de données et la créer si ce n'est pas le cas. je le sais 

db.createCollection(collName, {strict:true}, function(error, collection))

vérifie l'existence de la collection collName avant de la créer et définit l'objet error. mais j'ai besoin d'une fonction indépendante pour vérifier cela.

29
Nasser Torabzade

Dans MongoDB 3.0 et versions ultérieures, vous devez exécuter une commande pour répertorier toutes les collections d'une base de données:

use test;
db.runCommand( { listCollections: 1 } );

Bien que l'interrogation system.namespaces fonctionne toujours lorsque vous utilisez le moteur de stockage par défaut (MMAPv1), il n'est pas garanti que cela fonctionne pour d'autres moteurs, tels que WiredTiger.

Avant MongoDB 3.0, vous devez effectuer les opérations suivantes:

Vous pouvez interroger la collection system.namespaces:

use test;
db.system.namespace.find( { name: 'test.' + collName } );

Comme dans:

db.system.namespaces.find( { name: 'test.testCollection' } );

Qui retourne:

{ "name" : "test.testCollection", "options" : { "flags" : 1 } }

Ou bien sûr rien.

Voir aussi: https://github.com/mongodb/specifications/blob/master/source/enumerate-collections.rst

11
Derick

La méthode collectionNames de l'objet Db du pilote natif accepte un filtre de nom de collection facultatif comme premier paramètre pour vous permettre de vérifier l'existence d'une collection:

db.collectionNames(collName, function(err, names) {
    console.log('Exists: ', names.length > 0);
});

Dans la version 2.x du pilote natif de MongoDB, collectionNames a été remplacé par listCollections qui accepte un filtre et renvoie un curseur afin que vous procédiez comme suit:

db.listCollections({name: collName})
    .next(function(err, collinfo) {
        if (collinfo) {
            // The collection exists
        }
    });
24
JohnnyHK

En utilisant mongo-native driver et Node.js 7.6+, j’utilise ce qui suit:

const collections = await db.collections();
if (!collections.map(c => c.s.name).includes(collName)) {
    await db.createCollection(collName);
}
8
ChrisV

Depuis MongoDB 3.0, vous pouvez simplement lancer:

db.getCollectionNames()

qui retourne un tableau avec les noms de toutes les collections de la base de données courante:

[ "employees", "products", "mylogs"]

check Mongo DB Documentation , ou vous pouvez également utiliser db.getCollectionInfos () si vous avez besoin de plus d’informations sur chaque collection.

6
Roberto

Il existe maintenant une méthode listCollections dans le pilote natif Node.js. Il renvoie des informations sur toutes les collections de la base de données actuelle. Vous pouvez l'utiliser pour vérifier si une collection donnée est là:

collectionExists = function(name, cb) {
  mongoDb.listCollections().toArray(function(err, collections) {
    if (err) return cb(err);

    cb(null, collections.some(function(coll) {
      return coll.name == name;
    }));
  });
}
5
weekens

La question concerne le pilote natif, mais je suis arrivé ici en cherchant comment procéder dans pymongo. L'API de pymongo est généralement identique à celle de JS, mais dans ce cas, collection_names n'a pas d'argument pour le nom de la collection (comme dans JohnnyHK's answer ), mais le premier argument est un booléen ). Puisqu'une chaîne est évaluée à True, cela peut prêter à confusion. J'espère donc que cela aidera les futurs lecteurs:

import pymongo

cl = pymongo.MongoClient()
db = cl['my-db']
if 'my-col' in db.collection_names(False):
   ...
1
dimid

Si vous utilisez mongodb 3.1.10 . Voici comment vérifier si des collections existent.

MongoClient.connect(url, { useNewUrlParser: true }, function(err, client) {
  if (err) throw err;

  var dbo = client.db("dbname");
  dbo.listCollections().toArray(function(err, items){
    if (err) throw err;

    console.log(items); 
    if (items.length == 0)
        console.log("No collections in database")  
  }); 
});
0
roscoe_x