Pergunta

Eu precisa para obter uma lista de pedaços depois de fragmentação dentro do meu código Java.Meu código é simples e se parece com isso:

Mongo m = new Mongo( "localhost" , 27017 );

DB db = m.getDB( "admin" );

Object cr = db.eval("db.printShardingStatus()", 1);

Uma chamada de função eval() retorna um erro:

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)

E, realmente, se olharmos para o código de db.js na linha 891 há uma chamada para um método printShardingStatus() que não é definido dentro de um arquivo.Dentro do peixe.status() o método em utils_sh.js arquivo, há ainda um comentário:

// TODO:mova o real commadn aqui

Importante mencionar, quando eu executar esses comandos em mongo linha de comando, tudo funciona corretamente!

Minhas perguntas são:

  • Existe alguma outra possibilidade de obter uma completa fragmentação dentro do código Java?(por exemplo.com o banco de dados.comando() método)
  • Se não, alguma outra sugestão de como evitar que o meu problema?
Foi útil?

Solução

Muitos dos shell de ajudante de funções não estão disponíveis para o código do lado do servidor de execução.No caso de printShardingStatus(), não faz sentido porque não há um console para usar para saída de impressão e você gostaria de ter uma seqüência de caracteres retornada.Felizmente, você deve ser capaz de puxar até a fonte da função shell e reimplementar-lo em seu aplicativo (por exemplo,concatenar uma seqüência de caracteres retornada em vez de imprimir diretamente).

$ mongo
MongoDB shell version: 2.2.0
connecting to: test
> db.printShardingStatus
function (verbose) {
    printShardingStatus(this.getSiblingDB("config"), verbose);
}

Então, vamos olhar para o printShardingStatus() função...

> printShardingStatus
function (configDB, verbose) {
    if (configDB === undefined) {
        configDB = db.getSisterDB("config");
    }
    var version = configDB.getCollection("version").findOne();

    // ...
}

Antes de ligar todas as saída instruções para concatenação de seqüência de caracteres, você deseja certificar-se de que o outro DB métodos estão disponíveis para você.Desempenho-sábio, eu acho que a melhor opção é a porta entranhas desta função para Java e evitar lado do servidor JS avaliação completamente.Se você mergulhar fundo na printShardingStatus() função, você verá que é apenas a emissão de find() no banco de dados de configuração, juntamente com alguns group() consultas.

Se você quiser ficar com a avaliação de JS e prefere não manter este código dentro de seu aplicativo Java, você pode também procurar em armazenar JS funções do lado do servidor.

Outras dicas

Você já utilizou um caco de cluster corretamente?Se assim for, você pode se conectar a um mongo banco de dados que tem sharding habilitado.

Tente chamar o método db.printShardingStatus() com um banco de dados dentro do shell mongo e ver o que acontece.

Aparentemente, a função Javascript 'printShardingStatus' só está disponível para o shell mongo e não para a execução com comandos de servidor, para ver o código de início mongo.exe e digite apenas 'printShardingStatus' e pressione enter.

Neste caso, a escrita de um método de extensão seria a melhor solução...

Javascript de impressão e a saída do MongoDB consulta para um arquivo

1] criar um arquivo javascript

test.js

cursor = db.printShardingStatus();
while(cursor.hasNext()){
    printjson(cursor.next());
}

2] execução

mongo admin --quiet test.js > output.txt
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top