MongoDB 3 Java检查集合是否存在
我有以下问题:
我正在使用MongoDB 3的Java驱动程序。
在版本2中,可以执行DB.collectionExists(name)来检查所选数据库中是否存在集合。
在从DB切换到MongoDatabase的版本3中,此方法不再存在。
如何确定数据库中是否存在集合? 我尝试使用listCollectionNames()迭代集合,但这看起来非常无效。
谢谢你的帮助
你是对的。 似乎3.0.x版本的MongoDB驱动程序没有将直接“ 存在集合? ”方法MongoDatabase
到MongoDatabase
。
正如您已经提到的,一个选项是迭代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; }
- 创建长度为N的新数组的最快方法,并通过重复给定数组来填充它
- 我需要使用Java 8 Optional方法获取包装值,或者调用void返回Consumer lambda
- 向java.lang.Object添加一个字段
- 如何使用Http客户端在java中传递查询参数
- 在重叠时,玩家会被卡住libgdx矩形
- JBOSS 7.1.0错误 – 无法找到类org.jboss.resteasy.core.AsynchronousDispatcher的公共构造函数
- 使用什么冲洗模式’自动’或’提交’
- 管道中的Spark MLLib 2.0分类function
- 如何以正确的顺序生成自动化的客户端 – 服务器Java网络代码输出?