2013-11-27 48 views
0

我創建了一個Stored JS函數,它可以完成一個非常繁瑣的工作,更快,更高效。現在投入長時間的工作後,我想出了完成這個功能。MongoDB PHP驅動程序:使用執行存儲的JS

所以我的功能是假設myFunc();

db.system.js.save(
{ 
_id : "myFunc" , 
value : function (param1,param2,param3....){ ... }}); 

一旦我通過與完成該功能,並與蒙戈殼牌測試它作爲

db.eval("myFunc('a','b'...)"); 

db.loadServerScripts(); 
myFunc('a','b',..); 

我很滿意它會工作, 現在問題開始,如何用PHP實現這一點?

$cmd = 'db.eval("myFunc(\'a\',\'b\'...);");'; 
$data = $mongo_db->execute($cmd); 
var_dump($data); 

$ data拿出什麼都沒有.. !!

array(2) { ["retval"]=> NULL ["ok"]=> float(1) } 

有人請告訴我你到底我做錯了.. !!

+0

請提供可複製和粘貼的完整示例。有...不是很有用。 – Derick

+0

Weel the code is about 50 loc。而且我會在裏面做2個查詢。但問題是通過解決方法解決的。 :)還是謝謝.. !! –

回答

0

的簡單的解決方法,我發現:

var out = db.eval("abc(param1,param2..)"); return(JSON.stringify(out)); 

我知道它不是個好辦法的方式來實現這一目標,但到時候我找到一個更好的解決辦法(存儲JS是不是一個明智的方法),其我只有這樣。將發佈任何失敗的情況下。

2

你有一個類似的問題:Calling a stored procedure via PHP in MongoDB

反正作爲mongodb docs說:

注意我們不建議,如果可能的 使用服務器端存儲功能。

是一個更好的做法與MongoDB::execute,而不是將其存儲在db.system.js直接執行JS後調用它:

$func = 
    "function(greeting, name) { ". 
     "return greeting+', '+name+', says '+greeter;". 
    "}"; 
$scope = array("greeter" => "Fred"); 

$code = new MongoCode($func, $scope); 

$response = $db->execute($code, array("Goodbye", "Joe")); 
echo $response['retval']; 

來源:http://php.net/manual/en/mongodb.execute.php

隨着MongoCode對象您可以使用範圍界定並使用JS創建PHP對象,並且您可以在vcs上的PHP項目中共享此JS。

+0

?那你怎麼讓MapReduce沒有JS?你必須小心,但要注意服務器上的負載,但是如果你使用MongoDB,你必須使用JS。 – mcuadros

+0

從這個意義上說,reduce reduce不是JS,MR運行完全不同,因爲它是一個接受JS回調的數據庫命令 – Sammaye

+0

所以,我明白它不建議使用JS存儲函數,但我有一個強大的服務器支持我的需求,而且我試圖避免在請求服務器上進行計算。並且對eval也使用不鎖。 –

相關問題