MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Czy funkcja javascript po stronie serwera ma problemy z wydajnością w mongoDB?

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongo-go-driver error Nowy błąd klienta ClientOptions w argumencie mongo.NewClient

  2. Jak policzyć liczbę dokumentów w kolekcji mongodb

  3. Błąd podczas włączania szyfrowania danych przy użyciu klucza lokalnego MONGODB

  4. Konwertuj format daty i godziny z usługi internetowej na ciąg

  5. Jak zaktualizować wiele pól za pomocą Update.Set w MongoDB przy użyciu oficjalnego sterownika c#?