Llamar a la función MongoDB desde Java

Estoy tratando de llamar a una función de JavaScript almacenada desde el controlador Java MongoDB.

He estado siguiendo esta guía para almacenar la función en el servidor de base de datos y puedo llamar a la función desde el shell mongo y obtener el resultado.

Sin embargo, no puedo entender cómo llamar a la misma función en Java?

De acuerdo con esto http://api.mongodb.org/java/current/com/mongodb/DB.html#doEval-java.lang.String-java.lang.Object...- hay un método llamadodoEval

También he tratado de usarlo con este método:

public static String callFunction() {

    try (MongoClient client = new MongoClient("localhost")) {
        com.mongodb.DB db = client.getDB("TestDB");
        return db.doEval("echoFunction", 3).toString();
    }
}

Pero cuando llamo al método, esto es lo que obtengo:

{ "retval" : { "$code" : "function (x) {\n    return x;\n}"} , "ok" : 1.0}

y esperaría recuperar el número 3 en este caso.

Otro problema con el código anterior es que el método client.getDB()está en desuso. Según tengo entendido, el nuevo método para llamar es client.getDatabase()y devuelve un MongoDatabaseobjeto, pero según la API no hay ningún método para ejecutar una función.

Entonces mi pregunta es: ¿es posible ejecutar una función JavaScript almacenada en el servidor de base de datos desde Java y recuperar el resultado de esa función? Y si es posible, agradecería un poco de ayuda sobre cómo hacerlo.

Gracias.

Editar:

Según un comentario sobre la función js del servidor de llamadas en mongodb desde java:

"Parece que getNextSequence es una función escrita en el shell mongo javascript. Ni la base de datos (mongod) ni el lado de Java saben que esta función existe y tampoco es capaz de interpretar el código Javascript que contiene la función. Tendrá que volver a implementarla en Java ".

La función que estoy tratando de implementar es un poco más compleja que el ejemplo anterior: se supone que devuelve una colección de documentos y parece que no funciona con el método db.doEval.

¿Entonces supongo que el comentario es correcto?

Respuesta 1

Puede hacer todo esto con el controlador de Java.

MongoClient mongoClient = new MongoClient();
MongoDatabase mdb = mongoClient.getDatabase("TestDB");

/* run this <code snippet> in bootstrap */
BsonDocument echoFunction = new BsonDocument("value",
        new BsonJavaScript("function(x1) { return x1; }"));

BsonDocument myAddFunction = new BsonDocument("value",
        new BsonJavaScript("function (x, y){ return x + y; }"));

mdb.getCollection("system.js").updateOne(
        new Document("_id", "echoFunction"),
        new Document("$set", echoFunction),
        new UpdateOptions().upsert(true));

mdb.getCollection("system.js").updateOne(
        new Document("_id", "myAddFunction"),
        new Document("$set", myAddFunction),
        new UpdateOptions().upsert(true));

mdb.runCommand(new Document("$eval", "db.loadServerScripts()"));
/* end </code snippet> */

Document doc1 = mdb.runCommand(new Document("$eval", "echoFunction(5)"));
System.out.println(doc1);

El resultado también es:

Document{{retval=5.0, ok=1.0}}
Respuesta: 2

¿Es posible que el hilo 2 imprima "x = 0"? int x = 0; boolean bExit = falso; Hilo 1 (no sincronizado) x = 1; bExit = verdadero; Hilo 2 (no sincronizado) si (bExit == true) System.out.println ("x = ...

Esto es lo que necesito hacer. Capacidad para revertir el contenido de una matriz dimensional única de tamaño variable, sin utilizar otra matriz temporal. Dada una matriz dimensional única de enteros, números, ...

Tengo una expresión regular para extraer dos tokens, delimitadores ['] y palabras entre apóstrofes como' Desbordamiento de pila '. La pregunta es, ¿por qué esta expresión regular no funciona? Regex: ([']) |' ([^ '] *) ...

Tengo un JPanel que tiene 2+ JLables, me gustaría poder tomar una etiqueta y luego moverla a una ubicación diferente en el JPanel. ¿Cómo puedo hacer eso? Las únicas cosas que puedo encontrar en esto son conmovedoras ...