MongoDB PHP驱动程序:对存储的JS使用Execute

时间:2013-11-27 12:20:36

标签: php mongodb mongodb-php

我创建了一个Stored JS函数,据说可以更快更有效地完成一项非常繁琐的工作。经过长时间的投入工作后,我想出了完成这项功能。

所以我的函数是假设myFunc();

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

完成此功能后,使用Mongo Shell进行测试

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

有人告诉我,我做错了什么...... !!

2 个答案:

答案 0 :(得分:2)

您有类似的问题:Calling a stored procedure via PHP in MongoDB

无论如何mongodb docs说:

  

注意如果,我们不建议使用服务器端存储的函数   可能的。

更好的做法是使用MongoDB::execute直接执行JS,而不是将其存储在db.system.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。

答案 1 :(得分:0)

我发现简单的解决方法:

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

我知道实现这一点并不是最好的方法,但直到我找到更好的解决方法(因为Stored JS不是一个明智的方法),这是我唯一的方法。如果发生任何故障,将发布。