Funktionen in db.system.js gespeichert Auswertung („Stored Procedures“, wenn Sie möchten, dass sie nennen, dass) ist veraltet. Die Artikel auf den db.eval shell function und the eval database command haben eine Warnung "Veraltet seit Version 3.0" und the article on server-sided javascript erwähnt es nicht mehr. Also solltest du es vermeiden. Ein Grund ist, dass Sie keine JavaScript-Funktion ausführen können, wenn Sie Sharding verwenden. Wenn Sie also eine Anwendung erstellen, für die eval erforderlich ist, verhindern Sie, dass sie in Zukunft skaliert wird. Ein anderes ist, dass JavaScript-Funktionen das Berechtigungskonzept untergraben. Sie müssen immer als Admin ausgeführt werden, was es unmöglich macht, ein vernünftiges Berechtigungssystem einzurichten. Dies ist insbesondere unter dem Gesichtspunkt der Sicherheit problematisch, da serverseitige Skripts, die vom Benutzer bereitgestellte Daten verwenden, potenziell für willkürliche Skript-Injektionen anfällig sein können.
Der Vorteil der serverseitigen JavaScript ist, dass es auf dem Datenbankserver ausgeführt wird. Dies verringert die Latenz zwischen Anwendungsserver und Datenbankserver, wenn Sie eine große Anzahl von Abfragen ausführen müssen. Aber Sie können den gleichen Vorteil erzielen, indem Sie eine Mongo-Shell auf dem Datenbankserver öffnen und dort ausführen.
Die Latenz Vorteil ist nur dann relevant, wenn Sie mehrere Abfragen von Ihrem Skript auszuführen. Wenn Sie nur eine Abfrage haben, haben Sie immer noch die Wartezeit beim Aufrufen des Skripts. Sie erhalten also nichts als unnötige Komplexität.
Es gibt keine zusätzlichen Caching oder andere Optimierung für die serverseitige JavaScript.Noch schlimmer: Es wird jedes Mal, wenn Sie es ausführen, repariert und neu interpretiert. Es könnte also sogar langsamer als Javascript in Ihrem Anwendungsserver sein.
Weiterhin viele komplexe Abfragen, die Script-Unterstützung erfordern würde nur zu implementieren, mit find()
oft ausgedrückt werden kann aggregation verwendet, die in den meisten Fällen weit schneller als das gleiche zu tun mit find()
und Javascript, da die Aggregation Framework in C implementiert ++ und hat Zugriff auf die rohen BSON-Dokumente.
Behalten Sie eine Frage per Post. SO erlaubt nicht, 4 Fragen gleichzeitig zu stellen. –
@Salvador Diese Fragen sind alle eng miteinander verbunden, ich sehe wenig Sinn darin, sie in drei separate Beiträge aufzuteilen. – deceze
1: Nein, 2: Nein, 3: Natürlich nicht – Sammaye