我有以下问题:
我正在使用MongoDB 3的Java驱动程序。
在版本2中,可以执行DB.collectionExists(name)来检查所选数据库中是否存在集合。
在从DB切换到MongoDatabase的版本3中,此方法不再存在。
如何确定数据库中是否存在集合?我尝试使用listCollectionNames()迭代集合,但这似乎非常无效。
感谢您的帮助
答案 0 :(得分:17)
你是对的。似乎3.0.x版本的MongoDB驱动程序没有将{收集存在?“方法移植到MongoDatabase
。
正如您已经提到的,一个选项是迭代listCollectionNames()
的结果。虽然这似乎无效,但非常类似于DB.collectionExists(String)
方法的实现。下面的代码段是从mongo-java-driver source中的DB.java
类复制的:
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
方法进行迭代。
答案 1 :(得分:13)
另一种方法是使用MongoIterable.into
函数将这些函数添加到您可以调用contains("collectionName")
的目标ArrayList。
boolean collectionExists = client.getDatabase("dbName").listCollectionNames()
.into(new ArrayList<String>()).contains("collectionName")
答案 2 :(得分:1)
当我试图找出一种检查集合是否存在的有效方法时,我发现了这篇文章。由于我的数据库中有超过50k的集合,因此使用listCollectionNames()
方法的效率非常低。
我所做的是使用db.collection.count()
方法,如果它返回非零值,那么我会将其视为不存在的集合。当然,这不是百分之百正确的,因为一个人可以拥有一个零条目的集合,这种方法会将其视为一个不存在的集合。但是对于MongoDB中的大多数场景,只有在至少有一个文档的情况下,集合才有意义。以下是示例代码
public boolean isCollectionExists(DB db, String collectionName)
{
DBCollection table = db.getCollection(collectionName);
return (table.count()>0)?true:false;
}
答案 3 :(得分:1)
对于仍在寻找的人: 假设你有一个名为&#34; db&#34;
的MongoDatabase实例try {
db.createCollection("myCol");
} catch (MongoCommandException e) {
System.err.println("Collection Exists");
}
答案 4 :(得分:0)
我在搜索完全相同的问题时发现了这篇文章。使用最新的驱动程序,即:
<!-- 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;
}
答案 5 :(得分:0)
MongoIterable <String> collection = database.listCollectionNames();
for(String s : collection) {
if(s.equals("collectionName")) {
return true;
}
}
return false;
}