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 файле есть даже комментарий:
// ЗАДАЧИ:переместите фактическую командную строку сюда
Важно отметить, что когда я запускаю эти команды в командной строке 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();
// ...
}
Прежде чем преобразовать все выходные инструкции в конкатенацию строк, вы хотели бы убедиться, что все остальные методы базы данных вам доступны.С точки зрения производительности, я думаю, лучший вариант - перенести внутренности этой функции на Java и вообще избежать оценки JS на стороне сервера.Если вы погрузитесь глубже в printShardingStatus()
функция, вы увидите, что она просто выдает find()
в базе данных конфигурации вместе с некоторыми group()
запросы.
Если вы действительно хотите придерживаться оценки JS и предпочли бы не сохранять этот код в своем Java-приложении, вы также можете ознакомиться с хранение функций JS на стороне сервера.
Другие советы
Правильно правильно ли вы развернул абразный кластер? Если это так, вы можете подключиться к базе данных Mongo, которая включена в Sharding.
Попробуйте позвонить по методу db.printshardingStatus () с помощью этой базы данных в оболочке Mongo и посмотрите, что происходит.
Видимо, функция JavaScript 'PrintShardingStatus' доступна только для оболочки Mongo, а не для выполнения с помощью команд серверов, чтобы увидеть код запуска mongo.exe и введите только «printShardStstatus» и нажмите Enter.
В этом случае написание метода расширения будет лучшим для решения этого ...
JavaScript способ печати вывода запроса MongoDB в файл
1] Создайте файл JavaScript
test.js
cursor = db.printShardingStatus();
while(cursor.hasNext()){
printjson(cursor.next());
}
.
2] Запустить
mongo admin --quiet test.js > output.txt
.