我试图从MongoDB Java驱动程序调用存储的JavaScript函数。
我一直在按照本指南将功能存储在数据库服务器上,并且我可以从mongo shell调用该函数并返回结果。
但是我无法弄清楚如何在Java中调用相同的函数?
根据此http://api.mongodb.org/java/current/com/mongodb/DB.html#doEval-java.lang.String-java.lang.Object...-,有一种称为from pyvirtualdisplay import Display
from selenium import webdriver
self.display = Display(visible=0, size=(1024, 768))
self.display.start()
self.driver = webdriver.Firefox()
我也尝试过用这种方法:
doEval
但是当我调用这个方法时,这就是我得到的:
public static String callFunction() {
try (MongoClient client = new MongoClient("localhost")) {
com.mongodb.DB db = client.getDB("TestDB");
return db.doEval("echoFunction", 3).toString();
}
}
我希望在这种情况下得到3号。
上述代码的另一个问题是不推荐使用方法{ "retval" : { "$code" : "function (x) {\n return x;\n}"} , "ok" : 1.0}
。据我所知,调用的新方法是client.getDB()
,它返回一个client.getDatabase()
对象,但根据API,没有方法可以执行函数。
所以我的问题是:是否可以从Java在数据库服务器上执行存储的JavaScript函数并获取该函数的结果?如果有可能的话,我会对如何做到这一点有所帮助吗?
谢谢。
修改
根据对Calling server js function on mongodb from java的评论:
"似乎getNextSequence是一个用mongo编写的函数 javascript shell。数据库(mongod)和Java端都没有 知道这个功能存在,也无法解释 函数包含的Javascript代码。你将不得不重新实现它 在Java中。 "
我试图实现的功能比上面的例子复杂一点 - 它应该返回一个文档集合,而且似乎没有使用db.doEval方法。
所以我猜这个评论是对的吗?
答案 0 :(得分:6)
您可以使用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);
结果还是:
Document{{retval=5.0, ok=1.0}}
答案 1 :(得分:0)
我通过以下方式解决了同样的问题:
我在mongoShell中运行一个命令来创建我存储的JavaScript函数:
db.system.js.save(
{
_id: "echoFunction" ,
value : function(x1) { return x1; }
}
)
db.system.js.save(
{
_id : "myAddFunction" ,
value : function (x, y){ return x + y; }
}
);
db.system.js.save(
{
_id: "fullFillCollumns" ,
value : function () {
for (i = 0; i < 2000; i++) {
db.numbers.save({num:i}); } }
}
);
从MongoDB Java Driver执行此功能:
MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("databaseName");
db.runCommand(new Document("$eval", "fullFillCollumns()"));
Document doc1 = db.runCommand(new Document("$eval", "echoFunction(5)"));
System.out.println(doc1);
Document doc2 = db.runCommand(new Document("$eval", "myAddFunction(5,8)"));
System.out.println(doc2);
我看到集合编号已创建并填充了值。在IntellijIdea控制台中,我看到:
Document{{retval=5.0, ok=1.0}}
Document{{retval=13.0, ok=1.0}}