MongoDB::execute

(PECL mongo >=0.9.3)

MongoDB::executeЗапускает код JavaScript на сервере базы данных [устарело]

Описание

public MongoDB::execute ( mixed $code [, array $args = array() ] ) : array
Внимание

Команда » eval, которую вызывает этот метод, не рекомендуется в MongoDB 3.0+.

Сервер базы данных Mongo работает на движке JavaScript. Этот метод позволяет запускать произвольный JavaScript в базе данных. Это может быть полезно, если вы хотите слегка коснуться нескольких коллекций или обработать некоторые результаты на стороне базы данных, чтобы уменьшить объем, который должен быть отправлен клиенту.

Запуск JavaScript в базе данных требует блокировки записи, то есть блокирует другие операции. Обязательно подумайте об этом, прежде чем запускать длинный скрипт.

Это оболочка для команды базы данных » eval. Этот метод в основном:

<?php

public function execute($code$args) {
    return 
$this->command(array('eval' => $code'args' => $args));
}

?>

MongoDB подразумевает оператор возврата, если у вас есть один оператор в одной строке. Это может вызвать некоторое неинтуитивное поведение. Например, это возвращает "foo":

<?php

$db
->execute('"foo";');

?>

Тем не менее, это вернет NULL:

<?php

$db
->execute('"bar"; "foo";'); // более одного оператора

$db->execute('db.foo.count(
);'
); // более одной строки

?>

Чтобы избежать неожиданного поведения, лучше не полагаться на MongoDB, чтобы решить, что возвращать, а явно указать возвращаемое значение. В приведенных выше примерах мы можем изменить их на:

<?php

$db
->execute('"bar"; return "foo";');

$db->execute('return db.foo.count(
);'
);

?>

Теперь первый оператор вернет "foo", а второй оператор вернет счетчик коллекции "foo".

Список параметров

code

MongoCode или строка для выполнения.

args

Аргументы для передачи в code.

Возвращаемые значения

Возвращает результат оценки.

Примеры

Пример #1 Пристой пример использования MongoDB::execute()

<?php

$response 
$db->execute("function() { return 'Привет, мир!'; }");
echo 
$response['retval'];

?>

Результатом выполнения данного примера будет что-то подобное:


Привет, мир!

Пример #2 Пример использования параметра MongoDB::execute()

Необязательный массив параметров будет передан в функцию JavaScript.

<?php

$response 
$db->execute("function(greeting, name) { return greeting+', '+name+'!'; }", array("Пока""Джо"));
echo 
$response['retval'];

?>

Результатом выполнения данного примера будет что-то подобное:


Пока, Джо!

Пример #3 Пример области

Если MongoCode объект используется вместо строки для первого параметра, можно передать область, в которой будет выполняться JavaScript.

<?php

$func 

    
"function(greeting, name) { ".
        
"return greeting+', '+name+', сказал '+greeter;".
    
"}";
$scope = array("greeter" => "Фред");

$code = new MongoCode($func$scope);

$response $db->execute($code, array("Пока""Джо"));
echo 
$response['retval'];

?>

Результатом выполнения данного примера будет что-то подобное:


Пока, Джо, сказал Фред

Смотрите также

Список изменений

Версия Описание
1.7.0 Этот метод устарел из-за того, что команда лежащий в основе » eval устарела в MongoDB 3.0+.

add a note add a note

User Contributed Notes 2 notes

up
5
Nanhe Kumar
6 years ago
$m = new MongoClient();
        $db = $m->test;
      
        $inset = "db.getCollection('foo').insert({'name':'nanhe','age':30});";
        $response = $db->execute($inset);
        print_r($response); //Array ( [retval] => [ok] => 1 )
      
        $response = $m->test->execute("db.getCollection('foo').insert({'name':'happy','age':18});");
        print_r($response); //Array ( [retval] => [ok] => 1 )
       
        $response = $m->test->execute("db.foo.insert({'name':'prince','age':16});");
        print_r($response); //Array ( [retval] => [ok] => 1 )
       
        $response= $m->test->execute("return db.foo.count();");
        print_r($response); //Array ( [retval] => 3 [ok] => 1 )
       
        $response= $m->test->execute("return db.foo.findOne();");
        print_r($response); //Array ( [retval] => Array ( [_id] => MongoId Object ( [$id] => 5287ccbe60e2eac9a0e2f1c6 ) [name] => nanhe [age] => 30 ) [ok] => 1 )
       
        /*
         * If you want use find function then use toArray because The find() function returns a cursor, which can't be returned from JavaScript.
         */
        $response= $m->test->execute("return db.foo.find().toArray();");
        print_r($response); //[$id] => 5287cd2260e2eac9a0e2f1ca ) [name] => happy [age] => 18 ) [2] => Array ( [_id] => MongoId Object ( [$id] => 5287cd2260e2eac9a0e2f1cb ) [name] => prince [age] => 16 ) [3] => Array ( [_id] => MongoId Object ( [$id] => 5287cdea60e2eac9a0e2f1cc ) [name] => nanhe [age] => 30 ) [4] => Array ( [_id] => MongoId Object ( [$id] => 5287cdea60e2eac9a0e2f1cd ) [name] => happy [age] => 18 ) [5] => Array ( [_id] => MongoId Object ( [$id] => 5287cdea60e2eac9a0e2f1ce ) [name] => prince [age] => 16 ) ) [ok] => 1 )
      
        $response= $m->test->execute("return db.foo.find({'name':'nanhe'}).toArray();");
        print_r($response); //Array ( [retval] => Array ( [0] => Array ( [_id] => MongoId Object ( [$id] => 5287ce9b60e2eac9a0e2f1d2 ) [name] => nanhe [age] => 30 ) ) [ok] => 1 )
        // $id value will be different in your case
up
0
nodkz at mail ru
8 years ago
In 1.7.2, a nolock option was added to eval. To use nolock you have to use the command interface directly:

db.runCommand({$eval: function() {return 42;}, nolock: true})

or with args

db.runCommand({$eval: function(x,y) {return x*y;}, args: [6,7], nolock: true})
To Top