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.
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
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
}
});
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);
}
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.
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;
}));
});
}
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):
...
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")
});
});