MongoDB::execute

(PECL mongo >=0.9.3)

MongoDB::executeEjecuta código JavaScript en el servidor de bases de datos [obsoleto]

Descripción

public MongoDB::execute ( mixed $code [, array $args = array() ] ) : array
Advertencia

La orden » eval, la cual invoca este método, está obsoleta en MongoDB 3.0+.

El servidor de bases de datos de Mongo contiene un motor JavaScript. Este método permite ejecutar cualquier código JavaScript en la base de datos. Puede resultar útil si se desea trabajar ligeramente sobre algunas colecciones, o procesar algunos resultados en el lado del servidor para reducir la cantidad de datos que se enviará al cliente.

Al ejecutar JavaScript en la base de datos se hace un bloqueo de escrituras, lo cual significa que se bloquean otras operaciones. Asegúrese de que tiene esto en consideración antes de ejecutar scripts costosos.

Este método es una envoltura para la orden de base de datos » eval. Este método es básicamente:

<?php

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

?>

Si se tuviera una única sentencia en una única línea, MongoDB devuelve un valor. Esto puede provocar comportamientos inesperados. Por ejemplo, el siguiente código devuelvo "foo":

<?php

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

?>

Sin embargo, este código devuelve NULL:

<?php

$db
->execute('"bar"; "foo";'); // más de una sentencia

$db->execute('db.foo.count(
);'
); // más de una línea

?>

Para evitar comportamientos inesperados, lo mejor es no dejar que MongoDB decida qué devolver, usando en su lugar una sentencia "return" explícita. Podríamos cambiar los ejemplos superiores por lo siguiente:

<?php

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

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

?>

Ahora, la primera sentencia devolverá "foo" y la segunda devolverá un contador de la colección "foo".

Parámetros

code

MongoCode o texto a ejecutar.

args

Argumentos que se deben pasar a code.

Valores devueltos

Devuelve el resultado de la evaluación.

Ejemplos

Ejemplo #1 Ejemplo sencillo de MongoDB::execute()

<?php

$response 
$db->execute("function() { return 'Hola, mundo!'; }");
echo 
$response['retval'];

?>

El resultado del ejemplo sería algo similar a:


Hola, mundo!

Ejemplo #2 Ejemplo de parámetros en MongoDB::execute()

Pasaremos a la función JavaScript valores del array del parámetro opcional.

<?php

$response 
$db->execute("function(despedida, nombre) { return despedida+', '+nombre+'!'; }", array("Hasta pronto""Juan"));
echo 
$response['retval'];

?>

El resultado del ejemplo sería algo similar a:


Hasta pronto, Juan!

Ejemplo #3 Ejemplo de ámbito

Si en lugar de un string, usáramos un MongoCode en el primer parámetro, podrá pasarse un ámbito en el cual se ejecutará JavaScript.

<?php

$func 

    
"function(despedida, nombre) { ".
        
"return despedida+', '+nombre+', dice '+despedidor;".
    
"}";
$scope = array("despedidor" => "Fran");

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

$response $db->execute($code, array("Hasta pronto""Juan"));
echo 
$response['retval'];

?>

El resultado del ejemplo sería algo similar a:


Hasta pronto, Juan, dice Fran

Ver también

Historial de cambios

Versión Descripción
1.7.0 Este método ha sido declarado obsoleto como resultado de estar también obsoleta en MongoDB 3.0+ la orden » eval.

add a note add a note

User Contributed Notes 2 notes

up
7
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
-1
nodkz at mail ru
7 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