MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Esecuzione di JS su MongoDB durante l'inserimento da PHP

Le funzioni JavaScript sono un tipo di prima classe in BSON (vedi specifica ), quindi in entrambi gli esempi (shell JS e PHP) memorizzerai la funzione stessa nel campo. Se vuoi valutare la funzione, dovresti eseguire JavaScript lato server. Considera questo esempio:

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

Produce il seguente output:

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

Se la tua funzione dipende da uno stato esterno (ad esempio, è necessario eseguire una query per calcolarne il risultato), probabilmente vorrai archiviarla in un campo separato e scorrere periodicamente i tuoi documenti e aggiornare un altro campo per conservarne l'output. Durante l'implementazione, tieni presente che valutazione del codice lato server ha diverse limitazioni di concorrenza.