4

DB.getCollection的JavaDoc状态:

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

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

考虑一下:

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

就我而言,我正在调用一个 mapreduce 作业,我传递了一个尚不存在的集合。这也会导致'{“serverUsed”:“localhost/127.0.0.1:27801”,“ok”:0.0,“errmsg”:“ns 不存在”}'。

我猜JavaDoc 是不正确的。实际上,该集合是稍后懒惰地创建的。

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

我正在使用 java 驱动程序版本 2.11.3

4

1 回答 1

8

在某种程度上你是对的,在java中如果你只是使用db.getCollection("COLLECTION_NAME")集合是不会创建的。例如:

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

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

    BasicDBObject document = new BasicDBObject();
    document.put("user_id", "1");
    System.out.println(coll1.insert(document));

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

    boolean collectionExists = db.collectionExists("COLLECTION_NAME");
    if (collectionExists == false) {
        db.createCollection("COLLECTION_NAME", null);
    }
于 2013-10-28T11:47:19.670 回答