MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Ausführen von JS auf MongoDB beim Einfügen aus PHP

JavaScript-Funktionen sind ein erstklassiger Typ in BSON (siehe Spezifikation ). ), sodass Sie in beiden Beispielen (JS-Shell und PHP) die Funktion selbst im Feld speichern. Möchte man die Funktion auswerten, müsste man serverseitiges JavaScript ausführen. Betrachten Sie dieses Beispiel:

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

Es ergibt die folgende Ausgabe:

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

Wenn Ihre Funktion von einem externen Zustand abhängt (z. B. wenn sie eine Abfrage ausführen muss, um ihr Ergebnis zu berechnen), möchten Sie sie wahrscheinlich in einem separaten Feld speichern und regelmäßig über Ihre Dokumente iterieren und ein anderes Feld aktualisieren, um seine Ausgabe zu speichern. Denken Sie bei der Implementierung daran, dass serverseitige Codeauswertung hat mehrere Parallelitätsbeschränkungen.