Ocenianie funkcje zapisane w db.system.js („Przechowywane procedur”, Kiedy chcesz zadzwonić do nich, że) jest przestarzała. Artykuły na db.eval shell function i the eval database command mają ostrzeżenie "Przestarzałe od wersji 3.0", a the article on server-sided javascript już o tym nie wspomina. Dlatego powinieneś go unikać. Jednym z powodów jest to, że nie możesz uruchomić funkcji javascript, gdy używasz shardowania. Więc kiedy tworzysz aplikację, która wymaga eval, zapobiegasz jej skalowaniu w przyszłości. Innym jest to, że funkcje javascript podważają koncepcję uprawnień. Zawsze muszą być uruchamiane jako administrator, co uniemożliwia ustanowienie rozsądnego systemu uprawnień. Jest to szczególnie problematyczne z punktu widzenia bezpieczeństwa, biorąc pod uwagę, że skrypty stronicowane, które wykorzystują dane dostarczane przez użytkowników, mogą potencjalnie być podatne na arbitralne iniekcje skryptów.
Zaletą javascript po stronie serwera jest to, że działa on na serwerze bazy danych. Zmniejsza to opóźnienie między serwerem aplikacji a serwerem bazy danych, gdy trzeba wykonać dużą liczbę zapytań. Ale możesz uzyskać tę samą korzyść, otwierając powłokę Mongo na serwerze bazy danych i wykonując ją tam.
Zaleta opóźnienia ma znaczenie tylko wtedy, gdy wykonujesz wiele zapytań ze swojego skryptu. Gdy masz tylko jedno zapytanie, nadal będziesz mieć opóźnienie podczas wywoływania skryptu. Nie zyskujesz nic poza niepotrzebną złożonością.
Nie ma dodatkowej buforowania ani innej optymalizacji dla javascript dwustronnego serwera.Co gorsza: zostanie zaatakowany i ponownie zinterpretowany za każdym razem, gdy go uruchomisz. Może to być nawet wolniejsze niż javascript na serwerze aplikacji.
Ponadto, wiele złożonych zapytań, które wymagają wsparcia skryptu tylko wdrożyć z find()
często może być wyrażona za pomocą aggregation które w większości przypadków znacznie szybciej niż robi to samo z find()
i javascript ponieważ ramy agregacja jest zaimplementowana w języku C++ i ma dostęp do surowych dokumentów BSON.
Jedno pytanie w poście. SO nie pozwala zadawać jednocześnie 4 pytań. –
@ Salvador Te pytania są ściśle ze sobą powiązane, nie widzę sensu dzielenia ich na trzy osobne posty. – deceze
1: Nie, 2: Nie, 3: Oczywiście nie – Sammaye