2015-04-17 15 views
4

我已經使用this example在Mongodb服務器內實現了JavaScript函數。如何使用Java MongoDriver執行MongoDB js腳本

當我使用mongo shell時它工作正常,但我想從Java程序中運行它。這是代碼:

public String runFunction() { 

    CommandResult commandResult1 = db.command("db.loadServerScripts()"); 
    CommandResult commandResult2 = db.command("echoFunction(3)"); 

    return commandResult2.toString(); 
} 

我不明白結果。

+0

什麼結果當你在mongo shell中嘗試時你會得到什麼?你在Java中得到什麼結果?也許你應該編寫另一個腳本來執行這兩個命令,看起來你忽略了commandResult1。 – Jim

+0

當我使用mongo shell的第一個命令是db.loadServerScripts()。然後運行echoFunction(3)。它工作正常,它打印3.當使用java程序時,我得到了這個結果: -
** {「ok」:0.0, 「errmsg」:「no such cmd:echoFunction(3)」,「code」:59,「bad cmd」:{「echoFunction(3)」:true}} ** – Tharanga

+0

您可以在另一個線程上找到答案。 https://stackoverflow.com/questions/47093563/how-to-execute-mongodb-native-query-json-using-mongo-java-driver-only/47097555#47097555 –

回答

2

以前的答案在MongoDB 3.4+中不起作用。在3.4及以上版本中,正確的方法是創建一個BasicDBObject並將其用作Database.runCommand()的參數。這是一個例子。

final BasicDBObject command = new BasicDBObject(); 
      command.put("eval", String.format("function() { %s return;}}, {entity_id : 1, value : 1, type : 1}).forEach(someFun); }", code)); 
      Document result = database.runCommand(command); 
1
@Autowired 
private MongoOperations mongoOperations; 

private final BasicDBObject basicDBObject = new BasicDBObject(); 

@PostConstruct 
private void initialize() { 
    basicDBObject.put("eval", "function() { return db.loadServerScripts(); }"); 
    mongoOperations.executeCommand(basicDBObject); 
} 

private void execute() { 
    basicDBObject.put("eval", "function() { return echoFunction(3); }"); 
    CommandResult result = mongoOperations.executeCommand(basicDBObject); 
} 

然後你就可以使用類似:

ObjectMapper mapper = new ObjectMapper(); 

而且MongoOperation的:

mongoOperations.getConverter().read(CLASS, DBOBJECT); 

只是儘量有一些解決方法取決於您的需求