MongoDB 3 Java检查集合是否存在

我有以下问题:

我正在使用MongoDB 3的Java驱动程序。

在版本2中,可以执行DB.collectionExists(name)来检查所选数据库中是否存在集合。

在从DB切换到MongoDatabase的版本3中,此方法不再存在。

如何确定数据库中是否存在集合? 我尝试使用listCollectionNames()迭代集合,但这看起来非常无效。

谢谢你的帮助

你是对的。 似乎3.0.x版本的MongoDB驱动程序没有将直接“ 存在集合? ”方法MongoDatabaseMongoDatabase

正如您已经提到的,一个选项是迭代listCollectionNames()的结果。 虽然这似乎无效,但它与DB.collectionExists(String)方法的实现非常相似。 下面的代码片段是从mongo-java-driver源代码中的DB.java类复制的:

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

您也可以通过调用getDB方法从MongoClient获取DB而不是getDB 。 这使您可以访问不推荐使用collectionExists方法。 当然, 我不推荐第二种方法 ,因为如上所述, 它已被弃用

因此,请继续使用listCollectionNames方法进行迭代。

另一种方法是使用MongoIterable.into函数将这些函数添加到可以调用contains("collectionName")的目标ArrayList上。

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

当我试图找出一种检查集合是否存在的有效方法时,我遇到了这篇文章。 由于我的数据库中有超过50k的集合,因此使用listCollectionNames()方法效率极低。

我做的是使用db.collection.count()方法,如果它返回一个非零值,那么我会把它当作一个不存在的集合。 当然,这不是百分之百正确,因为一个人可以拥有一个零条目的集合,这种方法会将其视为一个不存在的集合。 但是对于MongoDB中的大多数场景,只有在至少有一个文档的情况下,集合才有意义。 以下是示例代码,

 public boolean isCollectionExists(DB db, String collectionName) { DBCollection table = db.getCollection(collectionName); return (table.count()>0)?true:false; } 

我在搜索完全相同的问题时发现了这篇文章。 使用最新的驱动程序,即:

   org.mongodb mongo-java-driver 3.3.0  

有人可能想用:

 public boolean collectionExists(final String db, final String collectionName) { final MongoDatabase database = client.getDatabase(db); if (database == null) { return false; } final MongoIterable iterable = database.listCollectionNames(); try (final MongoCursor it = iterable.iterator()) { while (it.hasNext()) { if (it.next().equalsIgnoreCase(collectionName)) { return true; } } } return false; } 

对于仍在寻找的人:假设你有一个名为“db”的MongoDatabase实例

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