JavaScript функциите са първокласен тип в BSON (вижте спецификация ), така че и в двата примера (JS shell и PHP) ще съхранявате самата функция в полето. Ако искате да оцените функцията, ще трябва да изпълните JavaScript от страна на сървъра. Помислете за този пример:
<?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']);
Той дава следния резултат:
object(MongoCode)#7 (2) {
["code"]=>
string(26) "function() { return 123; }"
["scope"]=>
array(0) {
}
}
float(123)
Ако вашата функция зависи от някакво външно състояние (напр. трябва да изпълни заявка, за да изчисли резултата си), вероятно бихте искали да я съхраните в отделно поле и периодично да преглеждате вашите документи и да актуализирате друго поле, за да задържите изхода. Докато прилагате това, имайте предвид, че оценка на кода от страна на сървъра има няколко ограничения за едновременност.