从Java调用MongoDB函数

时间:2015-09-09 12:52:03

标签: java mongodb

我试图从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方法。

所以我猜这个评论是对的吗?

2 个答案:

答案 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}}