PHP-драйвер MongoDB: использование Execute для сохраненного JS

Я создал функцию 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) } 

Кто-нибудь, скажите мне, пожалуйста, что, черт возьми, я делаю неправильно .. !!


person Sarthak Sawhney    schedule 27.11.2013    source источник
comment
Пожалуйста, предоставьте полный пример, который можно скопировать и вставить. Иметь... не очень полезно.   -  person Derick    schedule 27.11.2013
comment
Weel код составляет около 50 мест. И я делаю в нем 2 запроса. Но проблема решается обходным путем. :) Все равно спасибо..!!   -  person Sarthak Sawhney    schedule 29.11.2013


Ответы (2)


У вас есть аналогичный вопрос по адресу: Вызов хранимой процедуры через PHP в MongoDB< /а>

Во всяком случае, как говорится в mongodb docs:

Примечание. По возможности не рекомендуется использовать хранимые функции на стороне сервера.

Лучше выполнять непосредственно JS с помощью MongoDB::execute вместо сохранения это в 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 вы можете использовать область видимости и создавать объекты PHP с вашим JS, и вы можете использовать этот JS в своем проекте PHP в vcs, все вместе.

person mcuadros    schedule 27.11.2013
comment
¿ Тогда как сделать MapReduce без JS? Вы должны быть осторожны, но о нагрузке на сервер, но вы ДОЛЖНЫ использовать JS, если вы работаете с MongoDB. - person mcuadros; 27.11.2013
comment
Сокращение карты не является JS в этом смысле, MR работает совершенно по-другому, например, это команда базы данных, которая принимает обратные вызовы JS. - person Sammaye; 27.11.2013
comment
Итак, я понимаю, что не рекомендуется использовать хранимую функцию JS, но у меня есть сильный сервер для поддержки моих нужд, и, кроме того, я пытаюсь избежать вычислений на моем запрашивающем сервере. А также без блокировки для eval. - person Sarthak Sawhney; 29.11.2013

Простой обходной путь, который я нашел:

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

Я знаю, что это совсем не рекомендуемый способ добиться этого, но до тех пор, пока я не найду лучший обходной путь (поскольку Stored JS не является рекомендуемым методом), это единственный способ, который у меня есть. Опубликую в случае какой-либо неудачи.

person Sarthak Sawhney    schedule 29.11.2013