从Java调用MongoDB函数

Emi*_*l C 6 java mongodb

我正在尝试从MongoDB Java驱动程序调用存储的JavaScript函数.

我一直在遵循本指南将该函数存储在DB服务器上,我可以从mongo shell调用该函数并返回结果.

但是我无法弄清楚如何在Java中调用相同的函数?

根据这个http://api.mongodb.org/java/current/com/mongodb/DB.html#doEval-java.lang.String-java.lang.Object ... .-有一个叫做的方法doEval

我也试过用这种方法:

public static String callFunction() {

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

但是当我调用这个方法时,这就是我得到的:

{ "retval" : { "$code" : "function (x) {\n    return x;\n}"} , "ok" : 1.0}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我希望得到3号.

上述代码的另一个问题是该方法client.getDB()已弃用.据我所知,调用的新方法是client.getDatabase(),它返回一个MongoDatabase对象,但根据API,没有方法来执行一个函数.

所以我的问题是:是否可以从Java在数据库服务器上执行存储的JavaScript函数并获取该函数的结果?如果有可能的话,我会对如何做到这一点表示感谢?

谢谢.

编辑:

根据来自java的mongodb上的calling server js函数的评论:

"似乎getNextSequence是一个用mongo javascript shell编写的函数.数据库(mongod)和Java端都不知道这个函数是否存在,也无法解释函数包含的Javascript代码.你将不得不在Java中重新实现它. ."

我试图实现的函数比上面的例子复杂一点 - 它应该返回一个文档集合,并且似乎没有使用db.doEval方法.

所以我认为评论是正确的?

小智 7

你可以用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);
Run Code Online (Sandbox Code Playgroud)

结果还是:

Document{{retval=5.0, ok=1.0}}
Run Code Online (Sandbox Code Playgroud)


rsu*_*min 1

你应该这样做:

        return db.doEval("echoFunction(3)").toString();
Run Code Online (Sandbox Code Playgroud)

如果您在 eval 中仅使用函数名称,则您仅引用服务器端存储函数代码的 JavaScript 变量。它不执行它。当您使用括号时,您请求实际执行一个函数。如果您需要发送比数字更复杂的内容,我建议使用 JSON 序列化器。