sql >> Base de Datos >  >> NoSQL >> MongoDB

Ejecutar JS en MongoDB al insertar desde PHP

Las funciones de JavaScript son un tipo de primera clase en BSON (ver specification ), por lo que en ambos ejemplos (JS shell y PHP) almacenará la función en el campo. Si desea evaluar la función, deberá ejecutar JavaScript del lado del servidor. Considere este ejemplo:

<?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']);

Produce el siguiente resultado:

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

Si su función depende de algún estado externo (por ejemplo, necesita ejecutar una consulta para calcular su resultado), probablemente desee almacenarla en un campo separado e iterar periódicamente sobre sus documentos y actualizar otro campo para mantener su salida. Al implementar esto, tenga en cuenta que evaluación del código del lado del servidor tiene varias limitaciones de concurrencia.