Když se ptáte na životaschopnost javascriptu na straně serveru, musíte si nejprve ujasnit, o jakém druhu javascriptu na straně serveru mluvíte. Podle dokumentace , existují čtyři různé druhy spouštění kódu na straně serveru. Naneštěstí jsou všechny trochu hackerská řešení pro situace, kdy nativní API nestačí:
The eval příkaz
eval má tu nevýhodu, že běží pouze na jednom uzlu. To značně snižuje jeho užitečnost v klastrovaném prostředí. Se shardovanými kolekcemi to vůbec nefunguje!
Ve výchozím nastavení také vytvoří globální zámek, který činí databázi zcela nepoužitelnou, dokud se skript nespustí. Tomu lze zabránit pomocí nolock
argument (pokud skript sám neudělá něco, co vytvoří globální zámek).
Odpověď od Sammaye také vysvětluje některé vážné bezpečnostní obavy.
Je to opravdu více testovací a administrační nástroj než něco, co byste měli používat pro jakoukoli běžnou operaci.
Spouštění souborů .js prostřednictvím instance shellu mongo na serveru
V tomto případě není kód spuštěn v databázi, ale spíše v jiném nezávislém procesu na jednom ze serverů. To znamená, že všechna požadovaná data z jiných fragmentů musí být přenesena na server, který spouští kód javascriptu, bez ohledu na to, co skript skutečně vrací.
Objevuje se jako další aplikace na serveru mongodb, takže nemůže dělat nic, co byste nemohli dělat také z vaší běžné aplikace. Je to další testovací a administrativní nástroj, který byste v běžném provozu neměli používat.
Najděte pomocí $where -operátor
Operátor $where v příkazu find umožňuje předat funkci javascriptu, která se používá k filtrování hodnot. Ve většině triviálních případů je to mnohem méně výkonné než to, co nabízejí ostatní nástroje vyhledávacího dotazu, zejména proto, že neumí používat žádné indexy.
Když se použití $where nelze vyhnout, zkuste alespoň použít některé z běžných nástrojů vyhledávacího dotazu k redukci sady dokumentů, které je třeba předat funkci $where.
MapReduce
MapReduce používá dvě funkce javascriptu k vytváření agregovaných dat. Dříve to byl primární nástroj pro dolování dat pro MongoDB, ale většinu jeho obvyklých případů použití nyní splňuje mnohem uživatelsky přívětivější rámec agregace .
Má také stejnou nevýhodu jako $where:Pokud nebudete filtrovat, budete muset pro každý dokument spouštět ne jednu, ale alespoň dvě funkce javascriptu.
Ale MapReduce může běžet alespoň distribuovaně a může být paralelizován.
tl;dr:
Použití Javascriptu je posledním opatřením pro velmi neobvyklé dotazy, které nelze provést běžným dotazovacím jazykem a které vyžadují přístup k příliš velkému množství dat, která mají být implementována v aplikaci. Pokud je to možné, dělejte to, co chcete, pomocí specializovaných nástrojů, které máte k dispozici, nebo implementujte svou logiku na aplikační vrstvě.