我需要在 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
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top