2013-11-27 1 views
0

Я создал функцию сохраненного JS, которая, предположительно, завершает очень утомительную работу, быстрее и эффективнее. Теперь, после долгой работы, я приступил к выполнению этой функции.MongoDB PHP Driver: использование Execute для сохраненного JS

Итак, моя функция - myFunc();

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

После того, как я был через с завершением этой функции и ее тестирования с Монго 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); 

$ Данные не имеют ничего .. !!

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

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

+0

Просьба представить полный пример, который можно скопировать и вставить. Имея ... не очень полезно. – Derick

+0

Ускорить код около 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 говорит:

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

Является лучшей практикой выполнения непосредственно 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, все вместе.

+0

? ¿Тогда как вы делаете MapReduce без JS? Вы должны проявлять осторожность, но о загрузке на сервере, но вы ДОЛЖНЫ использовать JS, если работаете с MongoDB. – mcuadros

+0

Сокращение карты не является JS в смысле этого, MR работает совершенно по-разному, поскольку одно это команда базы данных, которая принимает JS-обратные вызовы – Sammaye

+0

Итак, я понимаю, что не рекомендуется использовать хранимую функцию JS, но у меня есть сильный сервер для поддерживать мои потребности, и более того, я стараюсь избегать вычислений на моем запрашивающем сервере. А также без блокировки для eval. –