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

Hat die serverseitige Javascript-Funktion Leistungsprobleme in mongoDB?

Wenn Sie nach der Funktionsfähigkeit von serverseitigem Javascript fragen, müssen Sie zunächst klarstellen, von welcher Art von serverseitigem Javascript Sie sprechen. Laut der Dokumentation , gibt es vier verschiedene Arten der serverseitigen Codeausführung. Leider sind sie alle irgendwie hackige Workarounds für Situationen, in denen die native API nicht ausreicht:

Der eval Befehl

eval hat den Nachteil, dass es nur auf einem Knoten läuft. Dies verringert seine Nützlichkeit in einer Clusterumgebung erheblich. Mit geteilten Sammlungen funktioniert es überhaupt nicht!

Standardmäßig erstellt es auch eine globale Sperre, die die Datenbank vollständig unbrauchbar macht, bis das Skript ausgeführt wurde. Dies kann mit dem nolock verhindert werden Argument (es sei denn, das Skript selbst macht etwas, das eine globale Sperre erzeugt).

Die Antwort von Sammaye erklärt auch einige ernsthafte Sicherheitsbedenken.

Es ist wirklich eher ein Test- und Administrationstool als etwas, das Sie für den normalen Betrieb verwenden sollten.

Ausführen von .js-Dateien über eine Mongo-Shell-Instanz auf dem Server

In diesem Fall wird der Code nicht auf der Datenbank ausgeführt, sondern auf einem anderen unabhängigen Prozess auf einem der Server. Das bedeutet, dass alle erforderlichen Daten von anderen Shards auf den Server übertragen werden müssen, auf dem der Javascript-Code ausgeführt wird, unabhängig davon, was tatsächlich vom Skript zurückgegeben wird.

Es erscheint als eine weitere Anwendung für den Mongodb-Server, sodass es nichts tun kann, was Sie nicht auch in Ihrer regulären Anwendung tun könnten. Es ist ein weiteres Test- und Administrationstool, das Sie im regulären Betrieb nicht verwenden sollten.

Suchen Sie mit $where -Operator

Der $where-Operator in einem Find-Befehl ermöglicht die Übergabe einer Javascript-Funktion, die zum Filtern von Werten verwendet wird. Für die meisten trivialen Fälle ist dies viel weniger performant als das, was die anderen Tools der Suchabfrage zu bieten haben, insbesondere weil es keine Indizes verwenden kann.

Wenn die Verwendung von $where nicht vermieden werden kann, versuchen Sie zumindest, einige der normalen Werkzeuge der Suchabfrage zu verwenden, um die Menge der Dokumente zu reduzieren, die an die $where-Funktion übergeben werden müssen.

MapReduce

MapReduce verwendet zwei Javascript-Funktionen, um aggregierte Daten zu erstellen. Früher war es das primäre Data-Mining-Tool für MongoDB, aber die meisten seiner üblichen Anwendungsfälle werden jetzt durch das viel benutzerfreundlichere Aggregationsframework .

Es hat auch den gleichen Nachteil wie $where:Wenn Sie nicht filtern, müssen Sie nicht eine, sondern mindestens zwei Javascript-Funktionen für jedes Dokument ausführen.

Aber MapReduce kann zumindest verteilt laufen und parallelisiert werden.

tl;dr:

Die Verwendung von Javascript ist ein letzter Ausweg für sehr ungewöhnliche Abfragen, die nicht mit der normalen Abfragesprache durchgeführt werden können und die den Zugriff auf zu viele Daten erfordern, um in der Anwendung implementiert zu werden. Tun Sie, wenn möglich, mit den spezialisierten Tools, die Ihnen zur Verfügung stehen, was Sie wollen, oder implementieren Sie Ihre Logik auf der Anwendungsebene.