Pregunta

Necesito obtener una lista de fragmentos después de fragmentar mi código Java.Mi código es simple y se ve así:

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

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

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

Una llamada de eval() devuelve un error:

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)

Y, realmente, si miramos el código de db.js, en la línea 891 hay una llamada a un método printShardingStatus() que no está definido dentro de un archivo.Dentro del método sh.status() en el archivo utils_sh.js, incluso hay un comentario:

// HACER:mueva el comando real aquí

Es importante mencionar que cuando ejecuto estos comandos en la línea de comandos de mongo, ¡todo funciona correctamente!

Mis preguntas son:

  • ¿Existe alguna otra posibilidad de obtener un estado de fragmentación completo dentro del código Java?(p.ej.con el método DB.command())
  • Si no, ¿alguna otra sugerencia sobre cómo evitar mi problema?
¿Fue útil?

Solución

Muchas de las funciones auxiliares del shell no están disponibles para la ejecución de código del lado del servidor.En el caso de printShardingStatus(), tiene sentido porque no hay una consola para usar para imprimir resultados y preferirías que te devuelvan una cadena.Afortunadamente, deberías poder obtener el código fuente de la función Shell y volver a implementarla en tu aplicación (p. ej.concatenar una cadena devuelta en lugar de imprimir directamente).

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

Entonces, veamos el printShardingStatus() función...

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

    // ...
}

Antes de convertir todas las declaraciones de salida en concatenación de cadenas, querrá asegurarse de que todos los demás métodos de base de datos estén disponibles para usted.En cuanto al rendimiento, creo que la mejor opción es trasladar las entrañas de esta función a Java y evitar por completo la evaluación JS del lado del servidor.Si profundizas en el printShardingStatus() función, verás que solo está emitiendo find() en la base de datos de configuración junto con algunos group() consultas.

Si desea seguir evaluando JS y prefiere no mantener este código dentro de su aplicación Java, también puede investigar almacenar funciones JS en el lado del servidor.

Otros consejos

¿Ha implementado un clúster de fragmento correctamente? Si es así, podría conectarse a una base de datos Mongo que haya habilitado la fragmentación.

Intente llamar al método db.printshardingstatus () con una base de datos de esa base de datos de Mongo y vea qué sucede.

Aparentemente la función JavaScript 'PRINTSHARDINGSTATUS' solo está disponible para la concha de Mongo y no para la ejecución con los comandos del servidor, para ver el código Start Mongo.exe y escriba solo 'PrintShardingStatus' y presione Entrar.

En este caso, escribir un método de extensión sería lo mejor para resolver esto ...

JavaScript forma de impresión de salida de la consulta de MongOdb a un archivo

1] Crea un archivo JavaScript

test.js

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

2] RUN

mongo admin --quiet test.js > output.txt

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top