Tengo el siguiente problema:

Estoy usando el controlador Java para MongoDB 3.

En la versión 2 fue posible DB.collectionExists(nombre) para comprobar si existe una colección en la base de datos seleccionada.

En la versión 3 con el interruptor de la base de datos para MongoDatabase este método ya no existe.

¿Cómo puedo averiguar si existe una colección dentro de una base de datos? Traté de iterar sobre colecciones con listCollectionNames (), pero esto parece bastante ineficaz.

Gracias por su ayuda

InformationsquelleAutor Frozn | 2015-08-09

6 Comentarios

  1. 18

    Estás en lo correcto. Parece como si el 3.0.x versión de MongoDB conductor no puerto a través de un «la colección existen?» método para MongoDatabase.

    Como ya se mencionó, una opción para usted es para iterar a través de los resultados de listCollectionNames(). Mientras que esto parece ineficaz, es muy similar a lo que la aplicación de la DB.collectionExists(String) método que no. El siguiente fragmento de código se copió de la DB.java clase en mongo-java-controlador de la fuente:

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

    También se puede obtener de DB en lugar de MongoDatabase de la MongoClient llamando a la getDB método. Que le da acceso a la collectionExists método que está en desuso. Por supuesto, no recomiendo este segundo enfoque porque, como se ha mencionado, es obsoleto.

    Como resultado, vaya con su iteración a través de listCollectionNames enfoque.

    • Gracias por la respuesta no se veía en los controladores de código. Si no hay ningún otro enfoque que voy a escribir yo una breve función
    • Según el Javadoc de getDB, el DB, DBCollection, y DBCursor clases será obsoleta en el futuro por lo que es recomendable el uso de las sustituciones (por ejemplo,MongoDatabase) ahora. Consulte github.com/mongodb/mongo-java-driver/blob/master/driver/src/…
    • Yep! Su declaración, los ecos de todo lo que he mencionado (en negrita y en cursiva y enlazada) en mi post ya. Estoy de acuerdo 100%. 🙂
    • 🙂 Yo pensaba que significaba que sólo collectionExists era obsoleto…lo siento. Me alegro de que todos estamos en violentos acuerdo!
    • Lol! No a la violencia aquí. 🙂 Le agradezco que mencione aclaración adicional para todos los lectores!
    • ¿por qué utilizar «equalsIgnoreCase» en lugar de «iguales»? los nombres son sensibles a las mayúsculas
    • El código al que usted se refiere (que contiene equalsIngoreCase) viene directamente de MongoDB del código fuente del controlador. No estoy seguro de por qué se ignore el caso, ya que, como usted ha señalado, los nombres son sensibles a las mayúsculas. Pero tenga en cuenta que Mongodb en desuso este método.

  2. 15

    Una alternativa es el uso de la MongoIterable.into función para agregar estos a un objetivo ArrayList que usted puede llamar a contains("collectionName") en.

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

    Me encontré con este post, como yo estaba tratando de encontrar una manera eficaz de comprobar si existe una colección. Como puedo tener más de 50k Colecciones en mi base de datos, utilizando el listCollectionNames() método es extremadamente ineficiente.

    Lo que hice fue usar el db.collection.count() método y si se devuelve un valor distinto de cero, entonces me iba a tratar como un inexistente colección. Por supuesto esto no es cien por ciento correcto, ya que uno podría tener una colección con cero entradas y este enfoque se la trate como un inexistente colección. Pero para la mayoría de los escenarios en MongoDB, una colección tiene sentido sólo si al menos uno de los documentos. Siguiente es un ejemplo de código,

    public boolean isCollectionExists(DB db, String collectionName) 
    {
    
        DBCollection table = db.getCollection(collectionName);
        return (table.count()>0)?true:false;
    }
    • Gran idea, pero como ya se ha dicho, no está garantizado para trabajar. Por la manera de escribir return table.count() > 0; lugar como este es una expresión booleana válida.
    • Gracias por la sugerencia! También quería aclarar que está garantizado para trabajar como siempre que no tenga vacíos en las colecciones de diseño.
    • Esta realidad no funciona, otro trabajo-alrededor de sería la creación de una colección, si ya existe lanza una excepción, y por lo tanto, usted puede comprobar el error, si contiene «NamespaceExists», entonces usted sabe que la colección está allí. De lo contrario, utilice la lista y contiene una marca de verificación si no desea que este ligeramente hacky manera.
  4. 1

    para aquellos que todavía buscan:
    Asumiendo que usted tiene MongoDatabase instancia llamada «db»

    try {
            db.createCollection("myCol");
        } catch (MongoCommandException e) {
            System.err.println("Collection Exists");
        }
  5. 1
    MongoIterable <String> collection =  database.listCollectionNames();
        for(String s : collection) {
            if(s.equals("collectionName")) {
                return true;
    
            }
        }
        return false;
    }
  6. 0

    He encontrado este post, mientras que la búsqueda de la misma pregunta. Utilizando el controlador más reciente, es decir:

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

    alguien lo desea, puede utilizar:

    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;
    }
    • Hola Kiuz, parece haber algo mal con su mongoDB, tal vez usted tuvo una DB con ese nombre y se lo quitó y que de alguna manera está todavía en la meta de la información? Si yo trato de hacer lo que usted describe puedo obtener los resultados correctos. Es su cliente conectado? Estamos utilizando este fragmento de código en producción y funciona muy bien. Tengo que hacer algunas pruebas adicionales de mi lado y hacerle saber si de alguna manera se puede reproducir su descripción.
    • No se preocupe, la esperanza de que el código ayudado de todos modos! Btw. quien votada abajo un comentario sería bueno para resolver el problema.

Dejar respuesta

Please enter your comment!
Please enter your name here