1

在下面的程序getDatabaseNames()中返回一个值列表并getCollectionNames()返回一组值。为什么不都返回 a 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();
    }
}

}    
4

1 回答 1

0

不管这听起来多么奇怪,但是是的!

这不是 Java 特有的。正如这个相关问题所述,您也可以使用命令行工具复制此行为mongo

引用问题:

这是如何发生的:

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

就像 show dbs 演示的那样:

test1   empty
test1   0.0625GB

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

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

这意味着,虽然在同一个运行时,您可以 利用这个“功能”(?),并处理同名的两个数据库,但是如果出现问题,这将是一个很难清理的情况,并且JVM 在清理混乱之前已关闭......(理论上,因为我现在无法确认这一点......当我靠近我的开发 Mongo 实例时,我会报告我的发现。)

于 2013-03-04T09:00:09.723 回答