Вопрос

Мне нужно получить список фрагментов после сегментирования внутри моего 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
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top