【问题标题】:MongoDB PHP Driver: Using Execute for Stored JSMongoDB PHP 驱动程序:对存储的 JS 使用 Execute
【发布时间】:2013-12-13 02:07:29
【问题描述】:

我创建了一个 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) } 

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

【问题讨论】:

  • 请提供可以复制和粘贴的完整示例。拥有 ... 不是很有用。
  • Weel 代码约为 50 loc。我在其中进行了 2 个查询。但问题已通过解决方法解决。 :) 还是谢谢..!!

标签: php mongodb mongodb-php


【解决方案1】:

您有类似的问题: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。

【讨论】:

  • ?¿ 那么如何在没有 JS 的情况下制作 MapReduce?您必须注意服务器上的负载,但如果您使用 MongoDB,则必须使用 JS。
  • Map reduce 不是这个意义上的 JS,MR 的运行方式完全不同,因为它是一个接受 JS 回调的数据库命令
  • 所以,我知道不建议使用 JS 存储函数,但我有一个强大的服务器来支持我的需求,而且我试图避免在我的请求服务器上进行计算。并且还使用无锁进行评估。
【解决方案2】:

我发现的简单解决方法:

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

我知道它根本不是实现这一目标的可取方法,但直到我找到更好的解决方法(因为存储 JS 不是可取的方法)它是我唯一的方法。如有任何故障,将发布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多