在我的 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() 方法)
- 如果没有,任何其他建议如何避免我的问题?