sql >> Databáze >  >> NoSQL >> MongoDB

Spuštění JS na MongoDB při vkládání z PHP

Funkce JavaScriptu jsou v BSON prvotřídním typem (viz specifikace ), takže v obou příkladech (JS shell a PHP) budete do pole ukládat samotnou funkci. Pokud chcete funkci vyhodnotit, museli byste spustit JavaScript na straně serveru. Zvažte tento příklad:

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

Výsledkem je následující výstup:

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

Pokud vaše funkce závisí na nějakém externím stavu (např. potřebuje spustit dotaz, aby vypočítala svůj výsledek), pravděpodobně ji budete chtít uložit do samostatného pole a pravidelně iterovat dokumenty a aktualizovat další pole, aby udržel jeho výstup. Při implementaci mějte na paměti, že vyhodnocení kódu na straně serveru má několik omezení souběžnosti.



  1. najdete v MongoCollection<Document>

  2. Porozumění hledání v Node/Mongo

  3. Chci, aby moje funkce pre('save') mongoose fungovala pouze jednou

  4. MongoDB (noSQL), kdy rozdělit kolekce