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