MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Exécution de JS sur MongoDB lors de l'insertion à partir de PHP

Les fonctions JavaScript sont un type de première classe dans BSON (voir spécification ), donc dans les deux exemples (shell JS et PHP), vous stockerez la fonction elle-même dans le champ. Si vous souhaitez évaluer la fonction, vous devrez exécuter JavaScript côté serveur. Prenons cet exemple :

<?php

$m = new Mongo();
$db = $m->test;
$c = $db->foo;
$c->drop();

$f = 'function() { return 123; }';

$c->insert(['f' => new MongoCode($f)]);
var_dump($c->findOne()['f']);

$g = <<<'END'
    function() {
        var doc = db.foo.findOne();
        db.foo.update(
            { _id: doc._id },
            { $set: { f: doc.f() }}
        );
    }
END;

$db->execute(new MongoCode($g));

$c->insert(['f' => new MongoCode($f)]);
var_dump($c->findOne()['f']);

Il donne la sortie suivante :

object(MongoCode)#7 (2) {
  ["code"]=>
  string(26) "function() { return 123; }"
  ["scope"]=>
  array(0) {
  }
}
float(123)

Si votre fonction dépend d'un état externe (par exemple, elle doit exécuter une requête pour calculer son résultat), vous voudrez probablement la stocker dans un champ séparé et parcourir périodiquement vos documents et mettre à jour un autre champ pour conserver sa sortie. Lorsque vous implémentez cela, gardez à l'esprit que l'évaluation du code côté serveur a plusieurs limitations de simultanéité.