2

Java コード内でシャーディングした後、チャンクのリストを取得する必要があります。私のコードはシンプルで、次のようになります。

Mongo m = new Mongo( "localhost" , 27017 );

DB db = m.getDB( "admin" );

Object cr = db.eval("db.printShardingStatus()", 1);

eval() の呼び出しはエラーを返します:

Exception in thread "main" com.mongodb.CommandResult$CommandFailure: command failed [$eval]: { "serverUsed" : "localhost/127.0.0.1:27017" , "errno" : -3.0 , "errmsg" : "invoke failed: JS Error: ReferenceError: printShardingStatus is not defined src/mongo/shell/db.js:891" , "ok" : 0.0}
    at com.mongodb.CommandResult.getException(CommandResult.java:88)
    at com.mongodb.CommandResult.throwOnError(CommandResult.java:134)
    at com.mongodb.DB.eval(DB.java:340)
    at org.sm.mongodb.MongoTest.main(MongoTest.java:35)

実際、db.js のコードを調べると、891 行目に、ファイル内で定義されていないメソッド printShardingStatus() への呼び出しがあります。utils_sh.js ファイルの sh.status() メソッド内には、コメントもあります。

// TODO: 実際のコマンドをここに移動します

これらのコマンドをmongoコマンドラインで実行すると、すべてが正常に機能します。

私の質問は次のとおりです。

  • Java コード内で完全なシャーディング ステータスを取得する可能性は他にありますか? (例: DB.command() メソッドを使用)
  • そうでない場合、私の問題を回避するための他の提案はありますか?
4

3 に答える 3

7

シェルのヘルパー関数の多くは、サーバー側のコード実行には使用できません。の場合、printShardingStatus()出力を印刷するために使用するコンソールがなく、代わりに文字列を返す必要があるため、これは理にかなっています。ありがたいことに、シェル関数のソースを取得してアプリケーションに再実装できるはずです (たとえば、直接出力する代わりに、返された文字列を連結します)。

$ mongo
MongoDB shell version: 2.2.0
connecting to: test
> db.printShardingStatus
function (verbose) {
    printShardingStatus(this.getSiblingDB("config"), verbose);
}

それでは、printShardingStatus()関数を見てみましょう...

> printShardingStatus
function (configDB, verbose) {
    if (configDB === undefined) {
        configDB = db.getSisterDB("config");
    }
    var version = configDB.getCollection("version").findOne();

    // ...
}

すべての出力ステートメントを文字列連結に変換する前に、他の DB メソッドがすべて利用可能であることを確認する必要があります。パフォーマンスに関しては、この関数の内部を Java に移植し、サーバー側の JS 評価を完全に回避することが最善の選択肢だと思います。関数をさらに深く掘り下げると、いくつかのクエリと共に構成データベースでprintShardingStatus()発行されていることがわかります。find()group()

JS の評価に固執し、このコードを Java アプリケーション内に保持したくない場合は、JS 関数をサーバー側に格納することも検討できます。

于 2012-10-02T15:44:24.983 に答える
1

シャードクラスターを適切にデプロイしましたか?その場合は、シャーディングが有効になっているmongoデータベースに接続できます。

mongoシェル内のそのデータベースでメソッドdb.printShardingStatus()を呼び出してみて、何が起こるかを確認してください。

どうやら、Javascript関数「printShardingStatus」はmongoシェルでのみ使用可能であり、サーバーコマンドでの実行には使用できません。コードを確認するには、mongo.exeを開始し、「printShardingStatus」と入力してEnterキーを押します。

この場合、これを解決するには拡張メソッドを作成するのが最適です...

于 2012-10-02T13:56:21.790 に答える
1

MongoDB クエリの出力をファイルに出力する Javascript の方法

1] JavaScriptファイルを作成する

test.js

cursor = db.printShardingStatus();
while(cursor.hasNext()){
    printjson(cursor.next());
}

2]実行

mongo admin --quiet test.js > output.txt
于 2012-10-23T09:24:39.827 に答える