2015-09-09 11 views
5

MongoDB Javaドライバから格納されたJavaScript関数を呼び出そうとしています。JavaからMongoDB関数を呼び出す

私はこのガイドに従ってDBサーバーに関数を格納しました。私はmongoシェルから関数を呼び出して結果を返すことができます。

しかし、私はJavaで同じ関数を呼び出す方法を理解できませんか?私は、メソッドを呼び出すときに、これは私が得るものです

public static String callFunction() { 

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

:しかし

このhttp://api.mongodb.org/java/current/com/mongodb/DB.html#doEval-java.lang.String-java.lang.Object...-によると、私はまた、この方法でそれを使用しようとしましたdoEval

と呼ばれる方法があります

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

となり、この場合は3番を返すことになります。

上記のコードのもう1つの問題は、メソッドclient.getDB()が廃止されたことです。私が理解しているように、呼び出す新しいメソッドはclient.getDatabase()であり、MongoDatabaseオブジェクトを返しますが、APIによれば、関数を実行するメソッドはありません。

私の質問は次のとおりです。Javaからデータベースサーバー上に格納されたJavaScript関数を実行し、その関数の結果を戻すことは可能ですか?可能であれば、それをどうやって行うのか、助けていただければ幸いです。

ありがとうございました。

編集:

Calling server js function on mongodb from javaにコメントによると:

「getNextSequenceはモンゴジャバスクリプトシェル で書かれた関数であるように思えデータベース(のmongod)やJavaのどちらも。側面 はこの関数が存在することを認識しており、いずれの関数も関数 を解釈できません。 Javaで再実装する必要があります。 "

実装しようとしている関数は、上記の例より少し複雑です。つまり、ドキュメントのコレクションを返すことになっていて、db.doEvalメソッドを使用していないようです。

コメントは間違いないと思いますか?

答えて

1

あなたが代わりにこれを行う必要があります:あなたが使用している場合

 return db.doEval("echoFunction(3)").toString(); 

をちょうどあなたが唯一の機能のコードを格納するサーバー側でJavaScript変数を参照するのevalに名前を機能。実行しません。カッコを使用すると、実際に関数を実行するよう要求されます。数字よりも複雑なものを送る必要がある場合は、JSONシリアライザを使用することをお勧めします。

+0

OKは、ありがとうございました。しかし、それは私の質問に完全に答えません。私が書いたとおり、メソッドclient.getDB()は非推奨です。私が理解するように、呼び出す新しいメソッドはclient.getDatabase()であり、MongoDatabaseオブジェクトを返しますが、APIによれば関数を実行するメソッドはありません。ですから、非推奨のメソッド/クラスを使用しているかどうかを判断する必要があります。 –

+0

私の質問をより多くの情報で編集しました。 –

+0

私はあなたの助けを借りて答えを受け入れました。しかし、私はJavaで私の機能を実装することを選択しました。 –

0

私は次のように同じ問題解決:MongoDBのJavaのドライバーからこの機能を実行するには

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}); } } 
    } 
); 

::私は私の保存されたJavaScript関数を作成するmongoShellでコマンドを実行します

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}} 
3

これはすべて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}} 
関連する問題