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
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 collectionExists
qui 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
.
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")
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");
}
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;
}
MongoIterable <String> collection = database.listCollectionNames();
for(String s : collection) {
if(s.equals("collectionName")) {
return true;
}
}
return false;
}
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;
}