MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Executando JS no MongoDB ao inserir do PHP


As funções JavaScript são um tipo de primeira classe em BSON (consulte especificação ), então em ambos os exemplos (JS shell e PHP) você estará armazenando a própria função no campo. Se você quiser avaliar a função, terá que executar JavaScript do lado do servidor. Considere este exemplo:
<?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']);

Ele produz a seguinte saída:
object(MongoCode)#7 (2) {
  ["code"]=>
  string(26) "function() { return 123; }"
  ["scope"]=>
  array(0) {
  }
}
float(123)

Se sua função depende de algum estado externo (por exemplo, ela precisa executar uma consulta para calcular seu resultado), você provavelmente deseja armazená-la em um campo separado e iterar periodicamente em seus documentos e atualizar outro campo para manter sua saída. Ao implementar isso, lembre-se de que avaliação de código do lado do servidor tem várias limitações de simultaneidade.