为什么getDatabaseNames()返回List,而getCollectionNames()返回mongo DB中的一个集合

时间:2013-03-04 08:19:19

标签: mongodb mongoose mongo-java

在以下程序中getDatabaseNames()返回值列表,getCollectionNames()返回一组值。为什么两者都不返回Set

这是否意味着我们可以创建具有相同名称的数据库?

package demo;

import java.util.List;
import java.util.Set;

import com.mongodb.DB;
import com.mongodb.MongoClient;

public class Collections2 {

public static void main(String[] args) {
    MongoClient client=null;
    try {
        client=new MongoClient();

        //Lists all the database names 
        System.out.println("List of databases ");
        List<String> DBset=client.getDatabaseNames();
        for(String string:DBset){
                System.out.println(string);
        }

        //list all the collection names in school DB
        DB db=client.getDB("school");
        System.out.println("List of collections in school DB");
        Set<String> set=db.getCollectionNames();
        for (String string:set) {
            System.out.println(string);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

}    

1 个答案:

答案 0 :(得分:0)

但听起来很奇怪,但是是的!

这不是Java特有的。正如this related question所述,您也可以使用命令行工具mongo复制此行为。

引用问题:

  

以下是它的发生方式:

     
      
  1. 我已经有了一个名为“test1”的数据库,它只存储带有文档的集合。
  2.   
  3. 然后,我使用它来存储使用GridFS的文件,因此它包含二进制文件。(实际上,我认为这可能是原因,但我不知道为什么)
  4.   
  5. 现在问题发生了。当我尝试使用像test1这样的命令访问“test1”时。将创建一个名为“test1”的空数据库。
  6.         

    就像dbs演示的那样:

    test1   empty
    test1   0.0625GB
    

至于如何处理这个问题,我不确定,因为Java驱动程序只有这种获取DB的方法(截至当前的稳定版,2.10.1):

返回数据库实例的另一个函数getUsedDatabases()仅返回此运行中此MongoDB驱动程序实例使用的数据库对象。

这意味着,在同一个运行时,你可以使用这个“功能”(?),并处理两个同名的DB,但这会让人觉得难看如果出现问题就要清理干净的情况,并且在清理混乱之前关闭JVM ...(理论上,我现在无法确认这一点......当我靠近我时,我会报告我的发现开发Mongo实例。)