MongoDB 3 Java проверяет, существует ли коллекция

У меня есть следующая проблема:

Я использую драйвер Java для MongoDB 3.

В версии 2 было возможно выполнить DB.collectionExists(name), чтобы проверить, существует ли коллекция в выбранной базе данных.

В версии 3 с переключением с DB на MongoDatabase этот метод больше не существует.

Как узнать, существует ли коллекция в базе данных? Я пытался перебирать коллекции с помощью listCollectionNames(), но это кажется весьма неэффективным.

Спасибо за помощь

Ответ 1

Вы правы. Похоже, что версия драйвера MongoDB версии 3.0.x не переносила прямой "сборник существует"? метод MongoDatabase.

Как вы уже упоминали, один из вариантов - это выполнить итерацию результатов listCollectionNames(). Хотя это кажется неэффективным, оно очень похоже на то, что делает реализация метода DB.collectionExists(String). Ниже приведен фрагмент кода из DB.java в файле mongo-java-driver:

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

Вы также можете получить DB вместо MongoDatabase из MongoClient, вызвав метод getDB. Это дает вам доступ к методу collectionExists , который устарел. Конечно, я не рекомендую этот второй подход, потому что, как уже упоминалось, он устарел.

В результате перейдите к своей итерации над listCollectionNames.

Ответ 2

Один из вариантов - использовать функцию MongoIterable.into, чтобы добавить их в целевой ArrayList, который вы можете вызвать contains("collectionName").

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

Ответ 3

Я столкнулся с этим сообщением, когда пытался найти эффективный способ проверить, существует ли коллекция. Поскольку в моей базе данных более 50 тыс. Коллекций, метод listCollectionNames() крайне неэффективен.

То, что я сделал, это использовать метод db.collection.count(), и если он вернет ненулевое значение, я бы рассматривал его как несуществующую коллекцию. Конечно, это не на сто процентов правильное, поскольку у него может быть коллекция с нулевыми записями, и этот подход будет рассматривать это как несуществующую коллекцию. Но для большинства сценариев в MongoDB коллекция имеет смысл только в том случае, если у нее есть хотя бы один документ. Ниже приведен пример кода,

public boolean isCollectionExists(DB db, String collectionName) 
{

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

Ответ 4

Я нашел этот пост, ища тот же самый вопрос. Использование новейшего драйвера, т.е.:

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

кто-то может захотеть использовать:

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;
}