Fungsi JavaScript adalah tipe kelas satu di BSON (lihat spesifikasi ), jadi di kedua contoh (JS shell dan PHP) Anda akan menyimpan fungsi itu sendiri di bidang. Jika Anda ingin mengevaluasi fungsi tersebut, Anda harus menjalankan JavaScript sisi server. Perhatikan contoh ini:
<?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']);
Ini menghasilkan output berikut:
object(MongoCode)#7 (2) {
["code"]=>
string(26) "function() { return 123; }"
["scope"]=>
array(0) {
}
}
float(123)
Jika fungsi Anda bergantung pada beberapa keadaan eksternal (misalnya perlu menjalankan kueri untuk menghitung hasilnya), Anda mungkin ingin menyimpannya di bidang terpisah dan secara berkala mengulangi dokumen Anda dan memperbarui bidang lain untuk menyimpan outputnya. Saat Anda menerapkan ini, ingatlah bahwa evaluasi kode sisi server memiliki beberapa batasan konkurensi.