1

次のプログラム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();
    }
}

}    
4

1 に答える 1

0

これは奇妙に聞こえるかもしれませんが、そうです!

これは Java に限ったことではありません。this related question が述べているように、コマンド ライン ツールでもこの​​動作を再現できmongoます。

質問からの引用:

これがどのように起こるかです:

  1. ドキュメントを含むコレクションのみを格納する「test1」という名前のデータベースが既にあります。
  2. それから、GridFS を使用してファイルを格納するために使用しているため、バイナリ ファイルが含まれています (実際、これが原因である可能性があると思いますが、理由はわかりません)。
  3. そして今、問題が発生します。use test1 のようなコマンドを使用して「test1」にアクセスしようとすると、同じ名前「test1」の空のデータベースが作成されます。

show dbs が示すように:

test1   empty
test1   0.0625GB

これに対処する方法については、Java ドライバーには DB を取得するための次の方法しかないため (現在の安定版、2.10.1)、よくわかりません。

DB インスタンスを返すもう 1 つの関数 getUsedDatabases() は、この実行で MongoDB ドライバーのこのインスタンスによって使用された DB オブジェクトのみを返します。

これは、同じランタイムで、 この「機能」(?) を利用して、同じ名前の両方の DB を処理できることを意味します。混乱を一掃する前にJVMがシャットダウンされます...(理論的には、これを今すぐ確認することはできません...開発Mongoインスタンスの近くにいるときに、調査結果を報告します。)

于 2013-03-04T09:00:09.723 に答える