Kiedy pytasz o wykonalność javascript po stronie serwera, najpierw musisz wyjaśnić, o jakim rodzaju javascript po stronie serwera mówisz. Według dokumentacji , istnieją cztery różne rodzaje wykonywania kodu po stronie serwera. Niestety wszystkie są hackowym obejściem sytuacji, w których natywne API jest niewystarczające:
ocena polecenie
eval ma tę wadę, że działa tylko na jednym węźle. To znacznie zmniejsza jego użyteczność w środowisku klastrowym. W przypadku kolekcji podzielonych na fragmenty w ogóle nie działa!
Domyślnie tworzy również globalną blokadę, która sprawia, że baza danych jest całkowicie bezużyteczna do momentu uruchomienia skryptu. Można temu zapobiec za pomocą nolock
argument (chyba że sam skrypt zrobi coś, co tworzy globalną blokadę).
Odpowiedź Sammaye wyjaśnia również kilka poważnych problemów związanych z bezpieczeństwem.
To naprawdę bardziej narzędzie do testowania i administrowania niż coś, czego powinieneś używać do zwykłych operacji.
Uruchamianie plików .js za pośrednictwem instancji powłoki mongo na serwerze
W tym przypadku kod nie jest wykonywany w bazie danych, ale w innym niezależnym procesie na jednym z serwerów. Oznacza to, że wszystkie wymagane dane z innych fragmentów muszą zostać przesłane na serwer, który uruchamia kod javascript, bez względu na to, co faktycznie jest zwracane przez skrypt.
Pojawia się jako kolejna aplikacja na serwerze mongodb, więc nie może zrobić niczego, czego nie mógłbyś również zrobić ze zwykłej aplikacji. Jest to kolejne narzędzie testowe i administracyjne, którego nie powinieneś używać podczas normalnej pracy.
Znajdź za pomocą $where -operator
Operator $where w poleceniu find pozwala na przekazanie funkcji javascript, która służy do filtrowania wartości. W większości trywialnych przypadków jest to o wiele mniej wydajne niż to, co mają do zaoferowania inne narzędzia zapytania wyszukiwania, zwłaszcza że nie może korzystać z żadnych indeksów.
Gdy nie można uniknąć użycia $where, spróbuj przynajmniej użyć niektórych normalnych narzędzi find-query, aby zredukować zestaw dokumentów, które muszą zostać przekazane do funkcji $where.
MapReduce
MapReduce używa dwóch funkcji JavaScript do tworzenia zagregowanych danych. Kiedyś było to podstawowe narzędzie do eksploracji danych dla MongoDB, ale większość jego zwykłych przypadków użycia jest teraz spełnianych przez znacznie bardziej przyjazne dla użytkownika struktura agregacji .
Ma też tę samą wadę, co $where:jeśli nie filtrujesz, będziesz musiał uruchomić nie jedną, ale co najmniej dwie funkcje javascript dla każdego dokumentu.
Ale MapReduce może przynajmniej działać w trybie rozproszonym i może być zrównoleglony.
tl;dr:
Używanie Javascriptu jest środkiem ostatecznym w przypadku bardzo nietypowych zapytań, których nie można wykonać za pomocą normalnego języka zapytań i które wymagają dostępu do zbyt dużej ilości danych do zaimplementowania w aplikacji. Jeśli to możliwe, rób to, co chcesz, za pomocą dostępnych specjalistycznych narzędzi lub zaimplementuj swoją logikę w warstwie aplikacji.