JavaScript関数はBSONのファーストクラスのタイプです(仕様 を参照) )、したがって、両方の例(JSシェルと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)
関数が外部の状態に依存している場合(たとえば、結果を計算するためにクエリを実行する必要がある場合)、関数を別のフィールドに格納し、ドキュメントを定期的に繰り返し、別のフィールドを更新して出力を保持することをお勧めします。これを実装するときは、サーバー側のコード評価<に注意してください。 / a> 同時実行にはいくつかの制限があります。