MongoDB::execute

(PECL mongo >=0.9.3)

MongoDB::executeExécute le code JavaScript sur la base de données [Obsolète]

Description

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

La commande » eval, que cette méthode appelle, est obsolète en MongoDB 3.0 et supérieur.

Le serveur de base de données Mongo exécute un moteur Javascript. Cette méthode vous permet d'exécuter du Javascript arbitraire sur la base de données. Ceci peut être utile si vous voulez toucher un petit nombre de collections, ou pour traiter quelques résultats issus de la base de données afin de réduire la quantitié de données à envoyer au client.

L'exécution de Javascript dans la base de données pose un verrou en écriture, signifiant que les autres opérations sont bloquées. Gardez-le bien à l'esprit avant d'exécuter un script conséquant.

Ceci est un wrapper pour la commande » eval de base de données. Cette méthode est équivalente à :

<?php

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

?>

MongoDB implique une instruction de retour si vous avez une requête unique sur une seule ligne. Ceci peut causer des comportements non-intuitifs. Par exemple, l'exemple suivant retournera "foo" :

<?php

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

?>

Cependant, ceci retournera NULL:

<?php

$db
->execute('"bar"; "foo";'); // plus d'une requête

$db->execute('db.foo.count(
);'
); // plus d'une ligne

?>

Afin d'éviter tout comportement non-désiré, il convient de ne pas laisser MongoDB choisir ce qu'il doit retourner, mais explicitement définir une valeur de retour. Dans l'exemple ci-dessus, nous pouvons le modifier comme ceci :

<?php

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

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

?>

Maintenant, la première requête retournera "foo", et la seconde retournera un comptage de la collection "foo".

Liste de paramètres

code

un objet MongoCode ou une chaîne a exécuter.

args

Les arguments à passer à la requête code.

Valeurs de retour

Retourne le résultat de l'évaluation.

Exemples

Exemple #1 Exemple avec MongoDB::execute()

<?php

$response 
$db->execute("function() { return 'Bonjour le monde !'; }");
echo 
$response['retval'];

?>

L'exemple ci-dessus va afficher quelque chose de similaire à :


Bonjour le monde !

Exemple #2 Exemple avec MongoDB::execute()

Le tableau optionnel de paramètres sera passé à la fonction Javascript.

<?php

$response 
$db->execute("function(greeting, name) { return greeting+', '+name+'!'; }", array("Au revoir""Joe"));
echo 
$response['retval'];

?>

L'exemple ci-dessus va afficher quelque chose de similaire à :


Au revoir, Joe!

Exemple #3 Exemple de porté

Si un objet MongoCode est utilisé à la place d'une chaîne comme premier paramètre, un scope peut être passé dans lequel le Javascript sera exécuté.

<?php

$func 
=
    
"function(greeting, name) { ".
        
"return greeting+', '+name+', dit '+greeter;".
    
"}";
$scope = array("greeter" => "Fred");

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

$response $db->execute($code, array("Au revoir""Joe"));
echo 
$response['retval'];

?>

L'exemple ci-dessus va afficher quelque chose de similaire à :


Au revoir, Joe, dit Fred

Voir aussi

Historique

Version Description
1.7.0 Cette méthode est devenue obsolète, sachant qu'un résultat d'une commande » eval sous-jacente est devenu obsolète en MongoDB 3.0+.

add a note add a note

User Contributed Notes 2 notes

up
4
Nanhe Kumar
10 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
12 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