MongoDB:DB.PrintShardingStatus()/ sh.status()Javaで呼び出し(およびJavaScript)
質問
私の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()への呼び出しがあります。sh.Status()メソッドの内部utils_sh.jsファイルでは、コメントさえあります。
// TODO:ここで実際のコンマを移動する
重要なことには、Mongoコマンドラインでこれらのコマンドを実行すると、すべてが正しく機能します!
私の質問は次のとおりです。
- Javaコード内で完全なシャーディングステータスを取得する可能性は他にありますか?(例:db.command()メソッド)
- そうでない場合、他の提案は私の問題を回避する方法?
解決
シェルのヘルパー機能の多くは、サーバーサイドコードの実行には使用できません。 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()
関数に深くダイビングすると、Configデータベースにfind()
をいくつかのgroup()
クエリとともに発行するだけです。
JSの評価に固執し、Javaアプリケーション内でこのコードを保持しないでください。 JS関数の保存サーバー側
他のヒント
シャードクラスタを正しく展開しましたか? もしそうなら、あなたはSharding Enabledを持つMongoデータベースに接続することができます。
Mongoシェル内のそのデータベースを使用してメソッドdb.printshardingStatus()を呼び出して、何が起こるかを確認してください。
明らかにJavaScript関数 'PrintShardingStatus'は、Mongoシェルでのみ利用可能で、サーバコマンドを使用して実行しないようにして、コード開始Mongo.exeと「PrintShardingStatus」のみを入力してEnterキーを押します。
この場合、拡張方法を書き込むことは、これを解決するのに最適です...
MongoDBクエリの出力出力のJavaScript
1] JavaScriptファイルを作成する
test.js
cursor = db.printShardingStatus();
while(cursor.hasNext()){
printjson(cursor.next());
}
.
2]実行
mongo admin --quiet test.js > output.txt
.