即使javadoc这样说,java的DB.getCollection()也不会创建集合

Chr*_*tze 4 java mongodb

DB.getCollectionJavaDoc声明:

获取具有给定名称的集合.如果该集合不存在,则会创建一个新集合.

但是,似乎该集合实际上是在以后创建的.在getCollection()之后不存在.当我例如,插入一个文档,然后创建它.

考虑一下:

myCollection.getDB().getCollection("dummy").getStats()
(com.mongodb.CommandResult) { "serverUsed" : "localhost/127.0.0.1:27801" , "ok" : 0.0 , "errmsg" : "ns not found"}
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我正在调用mapreduce作业,我传递了一个尚未存在的集合.这也会导致'{"serverUsed":"localhost/127.0.0.1:27801","ok":0.0,"errmsg":"ns不存在"}'.

我猜JavaDoc是不正确的.实际上这个集合后来被懒惰地创建了.

如果是这样,那么实现立即创建集合的行为的最佳方法是什么?

我使用的是java驱动程序版本2.11.3

Jha*_*nvi 8

你在某种程度上是正确的,如果你只是使用db.getCollection("COLLECTION_NAME")集合而没有创建.例如:

    MongoClient mongoClient = new MongoClient("SERVER", 27017);
    DB db = mongoClient.getDB("DB_NAME");
    DBCollection coll1 = db.getCollection("COLLECTION_NAME");
Run Code Online (Sandbox Code Playgroud)

此处不会创建集合,但如果向其添加以下行,则将创建集合:

    BasicDBObject document = new BasicDBObject();
    document.put("user_id", "1");
    System.out.println(coll1.insert(document));
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以检查集合是否已存在,然后根据需要创建它:

    boolean collectionExists = db.collectionExists("COLLECTION_NAME");
    if (collectionExists == false) {
        db.createCollection("COLLECTION_NAME", null);
    }
Run Code Online (Sandbox Code Playgroud)

  • 哦,我知道,这是版本2.11.3.`collectionExists`在驱动程序版本3.x中消失了. (2认同)