web-dev-qa-db-fra.com

MongoDB 3 Java vérifie si la collection existe

J'ai le problème suivant:

J'utilise le pilote Java pour MongoDB 3.

Dans la version 2, il était possible de faire DB.collectionExists (name) pour vérifier si une collection existait dans la base de données sélectionnée.

Dans la version 3 avec le passage de DB à MongoDatabase, cette méthode n'existe plus.

Comment savoir si une collection existe dans une base de données? J'ai essayé de parcourir les collections avec listCollectionNames (), mais cela semble assez inefficace.

Merci de votre aide

13
Frozn

Vous avez raison. Il semble que la version 3.0.x du pilote MongoDB n’ait pas été transférée via une méthode "la collection existe-t-elle??" Directement à MongoDatabase.

Comme vous l'avez déjà mentionné, une option pour vous consiste à parcourir les résultats de listCollectionNames(). Bien que cela semble inefficace, il est très similaire à ce que fait la mise en oeuvre de la méthode DB.collectionExists(String). L'extrait de code ci-dessous a été copié de la classe DB.Java dans mongo-Java-driver source :

public boolean collectionExists(final String collectionName) {
    Set<String> collectionNames = getCollectionNames();
    for (final String name : collectionNames) {
        if (name.equalsIgnoreCase(collectionName)) {
            return true;
        }
    }
    return false;
}

Vous pouvez également obtenir DB au lieu de MongoDatabase à partir de MongoClient en appelant la méthode getDB. Cela vous donne accès à la méthode collectionExistsqui est obsolète. Bien sûr, je ne recommande pas cette seconde approche car, comme mentionné, il est déconseillé.

Par conséquent, passez de votre itération à l'approche listCollectionNames.

16
whyceewhite

Une alternative consiste à utiliser la fonction MongoIterable.into pour les ajouter à une ArrayList cible sur laquelle vous pouvez appeler contains("collectionName") on. 

boolean collectionExists = client.getDatabase("dbName").listCollectionNames()
    .into(new ArrayList<String>()).contains("collectionName")
11
finnergizer

pour ceux qui cherchent encore: En supposant que vous avez une instance de MongoDatabase appelée "db"

try {
        db.createCollection("myCol");
    } catch (MongoCommandException e) {
        System.err.println("Collection Exists");
    }
0
user1776098

Je suis tombé sur ce message alors que j'essayais de trouver un moyen efficace de vérifier si une collection existe. Comme j'ai plus de 50 000 Collections dans ma base de données, l'utilisation de la méthode listCollectionNames() est extrêmement inefficace.

Ce que j'ai fait était d'utiliser la méthode db.collection.count() et si elle renvoyait une valeur non nulle, je la traiterais alors comme une collection inexistante. Bien sûr, cela n’est pas exact à cent pour cent, puisqu’on pourrait avoir une collection avec zéro entrée et cette approche traiterait cela comme une collection inexistante. Mais pour la plupart des scénarios dans MongoDB, une collection n’a de sens que si elle contient au moins un document. Voici un exemple de code,

public boolean isCollectionExists(DB db, String collectionName) 
{

    DBCollection table = db.getCollection(collectionName);
    return (table.count()>0)?true:false;
}
0
Arun Kaly
MongoIterable <String> collection =  database.listCollectionNames();
    for(String s : collection) {
        if(s.equals("collectionName")) {
            return true;

        }
    }
    return false;
}
0
Youssef Lahia

J'ai trouvé ce post en cherchant exactement la même question. En utilisant le pilote le plus récent, à savoir:

<!-- Mongo driver, GeoJson with Jackson, Gson for Mongo (Jongo) -->
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-Java-driver</artifactId>
    <version>3.3.0</version>
</dependency>

quelqu'un peut vouloir utiliser:

public boolean collectionExists(final String db, final String collectionName) {
    final MongoDatabase database = client.getDatabase(db);
    if (database == null) {
            return false;
    }

    final MongoIterable<String> iterable = database.listCollectionNames();
    try (final MongoCursor<String> it = iterable.iterator()) {
        while (it.hasNext()) {
            if (it.next().equalsIgnoreCase(collectionName)) {
                return true;
            }
        }
    }

    return false;
}
0
Philipp