2015-08-09 9 views
10

Ho il seguente problema:controllo MongoDB 3 Java se la raccolta esiste

sto usando il driver Java per MongoDB 3.

Nella versione 2 è stato possibile fare DB.collectionExists (nome) controlla se esiste una collezione nel database selezionato.

Nella versione 3 con il passaggio da DB a MongoDatabase questo metodo non esiste più.

Come scoprire se esiste una raccolta all'interno di un database? Ho provato a scorrere le collezioni con listCollectionNames(), ma questo sembra abbastanza inefficace.

Grazie per l'aiuto

risposta

13

Sei corretto. Sembra come se la versione 3.0.x del driver MongoDB non fosse stata portata su una diretta "esiste la raccolta?" metodo a MongoDatabase.

Come già accennato, un'opzione consente di ripetere i risultati di listCollectionNames(). Mentre questo sembra inefficace, è molto simile a ciò che l'implementazione del metodo DB.collectionExists(String) fa. Il frammento di codice di seguito è stato copiato dalla classe DB.java in 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; 
} 

Si potrebbe anche ottenere DB anziché MongoDatabase dal MongoClient chiamando il metodo getDB. Questo ti dà accesso al metodo collectionExistsche è deprecato. Ovviamente, Non consiglio questo secondo approccio perché, come detto, è deprecato.

Come risultato, vai con la tua iterazione su listCollectionNames approccio.

+0

Grazie per la risposta non ha guardato il codice dei conducenti. Se non c'è altro approccio, mi scriverò una breve funzione – Frozn

+0

Secondo Javadoc per 'getDB', le classi' DB', 'DBCollection' e' DBCursor' saranno deprecate in futuro, quindi è consigliabile usare le sostituzioni (es. 'MongoDatabase') ora. Vedi https://github.com/mongodb/mongo-java-driver/blob/master/driver/src/main/com/mongodb/Mongo.java – Paul

+0

@Paul Yep! La tua dichiarazione riecheggia tutto ciò che ho menzionato (in grassetto e in corsivo e collegato) nel mio post già. Concordo al 100%. :) – whyceewhite

0

Mi sono imbattuto in questo post mentre stavo cercando di trovare un modo efficace per verificare se esiste una raccolta. Poiché ho più di 50.000 raccolte nel mio database, l'uso del metodo listCollectionNames() è estremamente inefficiente.

Quello che ho fatto è stato utilizzare il metodo db.collection.count() e se restituiva un valore diverso da zero, quindi lo considererei come una raccolta inesistente. Ovviamente questo non è corretto al cento per cento, dal momento che si potrebbe avere una raccolta con voci zero e questo approccio lo considererebbe una raccolta inesistente. Ma per la maggior parte degli scenari in MongoDB, una raccolta ha senso solo se ha almeno un documento. Di seguito è riportato un codice di esempio,

public boolean isCollectionExists(DB db, String collectionName) 
{ 

    DBCollection table = db.getCollection(collectionName); 
    return (table.count()>0)?true:false; 
} 
+0

Ottima idea ma, come hai già detto, non è garantito il funzionamento. Tra l'altro puoi scrivere 'return table.count()> 0;' invece dato che è un'espressione booleana valida. – Frozn

+0

@Frozn Grazie per il suggerimento! Volevo anche chiarire che è garantito che funzioni fino a quando non hai collezioni vuote di design. –

+0

Questo non funziona, un'altra soluzione sarebbe creare una raccolta, se già esiste genera un'eccezione e quindi puoi controllare l'errore, se contiene "NamespaceExists", allora sai che la collezione è lì . Altrimenti usa l'elenco e contiene il controllo sopra, se non vuoi questo modo leggermente hacky. – PeterS

-1

Ho trovato questo post durante la ricerca per la stessa identica domanda. Utilizzando il driver più recente, cioè .:

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

qualcuno potrebbe voler usare:

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

per una strana ragione Database MongoDatabase = mongoClient.getDatabase ("NAMEDB"); \t \t if (database == null) {...} database non è NULL per DB inesistente denominato 'NAMEDB' e se controllo database.getName()); ho come risultato 'NAMEDB' ma 'NAMEDB' non esiste. –

+0

Ciao Kiuz, sembra che ci sia qualcosa di sbagliato nel tuo mongoDB, forse hai un DB con quel nome e lo hai rimosso ed è ancora in qualche modo nella meta informazione? Se provo a fare ciò che descrivi, ottengo i risultati corretti. Il tuo cliente è connesso? Stiamo utilizzando questo snippet di codice in produzione e funziona perfettamente. Faccio qualche ulteriore test al mio fianco e ti faccio sapere se posso in qualche modo riprodurre la tua descrizione. – Philipp

+0

sei VERO, perché non mi piace in MongoDb, non vedo "rilascia" alla fine del codice;) Grazie per il supporto e scusami per il commento "noob" –

5

Un'alternativa è quella di utilizzare la funzione MongoIterable.into per aggiungere questi ad un ArrayList di destinazione che è possibile chiamare contains("collectionName") on.

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