我正在尝试从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)
你应该这样做:
return db.doEval("echoFunction(3)").toString();
Run Code Online (Sandbox Code Playgroud)
如果您在 eval 中仅使用函数名称,则您仅引用服务器端存储函数代码的 JavaScript 变量。它不执行它。当您使用括号时,您请求实际执行一个函数。如果您需要发送比数字更复杂的内容,我建议使用 JSON 序列化器。