sql >> Databasteknik >  >> NoSQL >> MongoDB

Kör JS på MongoDB vid infogning från PHP

JavaScript-funktioner är en förstklassig typ i BSON (se specifikation ), så i båda exemplen (JS-skal och PHP) kommer du att lagra själva funktionen i fältet. Om du vill utvärdera funktionen måste du köra JavaScript på serversidan. Tänk på det här exemplet:

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

Det ger följande utdata:

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

Om din funktion är beroende av något externt tillstånd (t.ex. den behöver köra en fråga för att beräkna resultatet), vill du antagligen lagra den i ett separat fält och periodvis iterera över dina dokument och uppdatera ett annat fält för att behålla dess utdata. När du implementerar detta, kom ihåg att kodutvärdering på serversidan har flera samtidighetsbegränsningar.



  1. Mongoose, indexera platser array

  2. Hur sätter man in resque-arbetare i produktionen?

  3. Hur frågar man mongodb från groovy/grails?

  4. SD MongoDB polymorfism i underdokument