2013-11-27 49 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也使用不锁。 –

相关问题