2015-08-09 16 views
10

ich habe folgendes Problem:MongoDB 3 Java überprüfen, ob Sammlung vorhanden

Ich bin mit dem Java-Treiber für MongoDB 3.

In Version 2 war es möglich, DB.collectionExists (Name) zu tun Überprüfen Sie, ob in der ausgewählten Datenbank eine Sammlung vorhanden ist.

In Version 3 mit der Umstellung von DB auf MongoDatabase existiert diese Methode nicht mehr.

Wie finde ich heraus, ob eine Sammlung in einer Datenbank existiert? Ich habe versucht, mit listCollectionNames() über die Sammlungen zu iterieren, aber das scheint ziemlich unwirksam zu sein.

Danke für Ihre Hilfe

Antwort

13

Sie haben Recht. Es sieht so aus, als ob die 3.0.x-Version des MongoDB-Treibers nicht über eine direkte "does-Auflistung existiert?" -Methode zu portiert wurde.

Wie bereits erwähnt, besteht eine Möglichkeit darin, die Ergebnisse von listCollectionNames() zu durchlaufen. Während dies unwirksam scheint, ist es sehr ähnlich wie bei der Implementierung der DB.collectionExists(String) Methode. Der Code-Snippet aus der DB.java Klasse in mongo-java-driver source kopiert wurde:

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

könnten Sie erhalten auch DB statt MongoDatabase vom MongoClient durch die getDB Methode aufrufen. Damit haben Sie Zugriff auf die collectionExists Methode , die veraltet ist. Natürlich, Ich empfehle diesen zweiten Ansatz nicht, weil, wie erwähnt, ist es veraltet.

Als Ergebnis, gehen Sie mit Ihrer Iteration über listCollectionNames Ansatz.

+0

Danke für die Antwort hat nicht auf den Treibercode geschaut. Wenn es keinen anderen Ansatz gibt, schreibe ich mir eine kurze Funktion – Frozn

+0

Nach dem Javadoc für "getDB" werden die 'DB',' DBCollection' und 'DBCursor' Klassen in der Zukunft veraltet sein, so dass es sinnvoll ist, die Ersetzungen zu verwenden (zB 'MongoDatabase') jetzt. Siehe https://github.com/mongodb/mongo-java-driver/blob/master/driver/src/main/com/mongodb/Mongo.java – Paul

+0

@Paul Yep! Ihre Aussage spiegelt alles, was ich erwähnt habe (fett und kursiv geschrieben und verlinkt), bereits in meinem Beitrag wieder. Ich stimme 100% zu. :) – whyceewhite

0

Ich stieß auf diesen Beitrag, als ich versuchte, einen effizienten Weg zu finden, um zu überprüfen, ob eine Sammlung existiert. Da ich mehr als 50k Sammlungen in meiner Datenbank habe, ist die Verwendung der listCollectionNames() Methode extrem ineffizient.

Was ich tat, war die Verwendung der db.collection.count()-Methode und wenn es einen Wert ungleich Null zurückgab, dann würde ich es als eine nicht vorhandene Sammlung behandeln. Natürlich ist dies nicht hundertprozentig richtig, da man eine Sammlung mit null Einträgen haben könnte und dieser Ansatz würde das als eine nicht existierende Sammlung behandeln. Für die meisten Szenarien in MongoDB ist eine Sammlung jedoch nur dann sinnvoll, wenn sie mindestens ein Dokument enthält. Folgendes ist ein Beispielcode,

+0

Großartige Idee, aber wie Sie bereits gesagt haben, funktioniert es nicht garantiert. Übrigens können Sie 'return table.count()> 0;' schreiben, da dies ein gültiger boolescher Ausdruck ist. – Frozn

+0

@Frozn Danke für den Tipp! Ich wollte auch klarstellen, dass es garantiert funktioniert, solange Sie keine leeren Kollektionen haben. –

+0

Dies funktioniert nicht wirklich, eine andere Problemumgehung wäre, eine Sammlung zu erstellen, wenn es bereits existiert, löst es eine Ausnahme aus, und deshalb können Sie den Fehler überprüfen, wenn es "NamespaceExists" enthält, dann wissen Sie, dass die Sammlung da ist . Ansonsten benutze die Liste und enthält die Kontrolle oben, wenn du diesen leicht hacky Weg nicht willst. – PeterS

-1

Ich fand diesen Beitrag bei der Suche nach genau der gleichen Frage. Mit den neuesten Treiber, d.h .:

<!-- 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> 

jemand verwenden möchten:

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

aus seltsamen Gründen MongoDatabase database = mongoClient.getDatabase ("NAMEDB"); \t \t if (database == null) {...} Datenbank ist nicht NULL für nicht existierende DB namens 'NAMEDB' und wenn ich überprüfen database.getName()); Ich habe als Ergebnis 'NAMEDB', aber 'NAMEDB' existiert nicht. –

+0

Hi Kiuz, scheint mit deiner mongoDB etwas nicht in Ordnung zu sein, vielleicht hattest du eine DB mit diesem Namen und entfernte sie und es ist irgendwie noch in der Meta-Information? Wenn ich versuche zu tun, was Sie beschreiben, bekomme ich die richtigen Ergebnisse. Ist Ihr Client verbunden? Wir verwenden dieses Code-Snippet in der Produktion und es funktioniert gut. Ich mache weitere Tests auf meiner Seite und lasse Sie wissen, ob ich Ihre Beschreibung irgendwie reproduzieren kann. – Philipp

+0

Sie sind wahr, weil ich in MongoDb noob, habe ich keine "Tropfen" am Ende des Codes sehen;) Danke für die Unterstützung und Entschuldigung für "noob" Kommentar –

5

Eine Alternative ist die MongoIterable.into Funktion verwenden, um diese zu einem Zielarraylist hinzufügen, die Sie contains("collectionName") anrufen können.

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