2015-05-08 8 views
9

In letzter Zeit gehe ich tief in MongoDB und ich wundere mich über die gespeicherten JavaScript-Prozeduren. Nachdem ich die Blog Entry von PointBeing gelesen hatte, bekam ich ein paar Fragen.Sind gespeicherte JavaScript-Prozeduren von MongoDB schneller?

  • Ist es ein echter Vorteil, meinen Code in der DB zu speichern? Ich meine Funktionen wie lookups for documents, nicht adding numbers wie das Beispiel von PointBeing.
  • Ist es schneller als JavaScript-Code für den Zugriff von der node.js Seite?
  • Wenn meine Abfragen in der Datenbank gespeichert sind, sind die zwischengespeicherten (und schneller)?

Ich schaue vom Punkt der node.js Entwicklung.

+2

Behalten Sie eine Frage per Post. SO erlaubt nicht, 4 Fragen gleichzeitig zu stellen. –

+3

@Salvador Diese Fragen sind alle eng miteinander verbunden, ich sehe wenig Sinn darin, sie in drei separate Beiträge aufzuteilen. – deceze

+1

1: Nein, 2: Nein, 3: Natürlich nicht – Sammaye

Antwort

13

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.

+0

Es ist schwierig, Abfragen mit der MongoDB C# Driver Version 1.7.0.4714 API zu implementieren, wenn die Abfrage viele Quasi-Joins zwischen MongoDB Collections beinhaltet. Ich glaube, es verlangsamt die Leistung, wenn Sie eine große Menge an Daten aus der MongoDB-Welt in C# -Welt als POCO-Objekte in einer Liste einbringen. Also dachte ich darüber nach, ob es gut wäre, die Implementierungspraxis von C# zu übernehmen, um in MongoDB gespeichertes JavaScript aufzurufen. Sie sagen, das Aufrufen von Stored JavaScript ist schlecht. Bitte sehen Sie: http://StackOverflow.com/Questions/36220272/c-sharp-invocation-of-stored-javascript-in-mongodb-vs-mongodb-c-sharp-driver-ver –

+0

@CSLewis Wenn Sie tun müssen viele Quasi-Joins, dann ist es sehr wahrscheinlich, dass Sie mongodb wie eine relationale Datenbank verwenden, die Ihnen selten gute Ergebnisse bringt. – Philipp

+0

ok, aber was ist, wenn ich nur eine intensive Analyse einer Sammlung mit einer großen Datenmenge mache. Ich denke, es wäre eine langsame Leistung, wenn man viele Dokumente aus der Sammlung als C# -POCO-Objekte in die C# -Welt einbringt. Stattdessen dachte ich, es wäre besser, wenn C# Stored JavaScript aufrufen würde, was einen Großteil der intensiven Analyse durchführen würde, und dann die Endergebnisse an die C# -Welt zurückgeben würde. Welche andere Alternative habe ich? –

3

Die urkomische Sache ist, dass Blog-Post (http://pointbeing.net/weblog/2010/08/getting-started-with-stored-procedures-in-mongodb.html) geschrieben wurde, wenn JS nur Single-Thread-globale Sperre nahm.

Das bedeutet, dass es keine Konversionswährung Features oder mehr granulare Sperre damit verbunden war (die Sperre ist immer noch ein Problem und Kon-Währung wird nur durch mehrere Isolate immer noch erreicht). Nur weil du es in einem zufälligen Blogeintrag siehst, heißt das nicht, dass es benutzt werden sollte.

Um Ihre Fragen direkt zu beantworten:

  1. Nope. Der Nachteil besteht darin, dass der anrufende Benutzer vollständige Administratorrechte benötigt. Dies bedeutet, dass Sie Ihrem Webbenutzer jedes einzelne Privileg geben, da die eingebaute JS-Enigne Hooks für alles hat, einschließlich Administrationsfunktionen, so dass es Administratorrechte erfordert, um ausgeführt werden zu können.

  2. Aufruf JS von JS zu JS zu C++ in JS? Nein

  3. Nein, das MongoDB-Caching funktioniert nicht so. Ich empfehle Ihnen, die Grundlagen Dokumentation zu lesen: http://docs.mongodb.org/manual/faq/fundamentals/

Verwandte Themen