蒙戈数据库:Java(和 JavaScript)中的 db.printShardingStatus() / sh.status() 调用
题
我需要在 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() 方法内部,甚至有一条注释:
// 去做:将实际命令移至此处
值得一提的是,当我在 mongo 命令行中运行这些命令时,一切正常!
我的问题是:
- 是否还有其他可能在 Java 代码中获得完整分片状态?(例如。使用 DB.command() 方法)
- 如果没有,还有其他建议如何避免我的问题吗?
解决方案
shell 的许多辅助函数不可用于服务器端代码执行。如果是 printShardingStatus()
, ,这是有道理的,因为没有用于打印输出的控制台,而您宁愿返回一个字符串。值得庆幸的是,您应该能够提取 shell 函数的源代码并在您的应用程序中重新实现它(例如连接返回的字符串而不是直接打印)。
$ 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();
// ...
}
在将所有输出语句转换为字符串连接之前,您需要确保其他数据库方法都可供您使用。就性能而言,我认为最好的选择是将这个函数的内部结构移植到 Java 中,并完全避免服务器端 JS 评估。如果你深入研究 printShardingStatus()
函数,你会看到它刚刚发出 find()
在配置数据库上以及一些 group()
查询。
如果您确实想坚持评估 JS 并且不想将此代码保留在 Java 应用程序中,您还可以查看 服务器端存储JS函数.
其他提示
您是否正确部署了碎片簇? 如果是这样,您可以连接到已启用分片的Mongo数据库。
尝试使用mongo shell中的数据库调用方法db.printShardingStatus(),并查看会发生什么。
显然,JavaScript函数'printShardingStatus'仅适用于Mongo shell,而不是使用服务器命令执行,以查看代码启动Mongo.exe并仅键入“PrintShardingStatus”并按Enter键。
在这种情况下,编写扩展方法是最好解决这个...
MongoDB查询的MongoDB查询输出的JavaScript方式
1]创建JavaScript文件
test.js
cursor = db.printShardingStatus();
while(cursor.hasNext()){
printjson(cursor.next());
}
.
2]运行
mongo admin --quiet test.js > output.txt
.