sql >> Database teknologi >  >> NoSQL >> MongoDB

Har server-side javascript-funktion ydeevneproblemer i mongoDB?

Når du spørger om levedygtigheden af ​​server-sidet javascript, skal du først gøre dig klart, hvilken slags server-sidet javascript du taler om. Ifølge dokumentationen , er der fire forskellige slags server-sidet kodeudførelse. Desværre er de alle slags hackiske løsninger til situationer, hvor den oprindelige API er utilstrækkelig:

evalen kommando

eval har den ulempe, at den kun kører på én node. Dette reducerer i høj grad dets anvendelighed i et klynget miljø. Med sharded samlinger virker det slet ikke!

Som standard opretter den også en global lås, som gør databasen fuldstændig ubrugelig, indtil scriptet er kørt. Dette kan forhindres med nolock argument (medmindre scriptet selv gør noget, der skaber en global lås).

Svaret fra Sammaye forklarer også nogle alvorlige sikkerhedsproblemer.

Det er i virkeligheden mere et test- og administrationsværktøj end noget, du skal bruge til enhver almindelig operation.

Kørsel af .js-filer via en mongo shell-instans på serveren

I dette tilfælde udføres koden ikke på databasen, men snarere på en anden uafhængig proces på en af ​​serverne. Det betyder, at alle de nødvendige data fra andre shards skal overføres til serveren, som kører javascript-koden, uanset hvad der rent faktisk returneres af scriptet.

Det vises som en anden applikation til mongodb-serveren, så den kan ikke gøre noget, du ikke også kunne gøre fra din almindelige applikation. Det er endnu et test- og administrationsværktøj, du ikke bør bruge i almindelig drift.

Find med $where -operatør

$where-operatoren i en find-kommando tillader at sende en javascript-funktion, som bruges til at filtrere værdier. I de fleste trivielle tilfælde er dette meget mindre effektivt end det, de andre værktøjer i søgeforespørgslen har at tilbyde, især fordi det ikke kan gøre brug af nogen indekser.

Når brugen af ​​$where ikke kan undgås, prøv i det mindste at bruge nogle af de normale værktøjer i find-forespørgslen for at reducere antallet af dokumenter, der skal sendes til $where-funktionen.

MapReduce

MapReduce bruger to javascript-funktioner til at skabe aggregerede data. Det plejede at være det primære dataminingværktøj for MongoDB, men de fleste af dets sædvanlige use-cases er nu opfyldt af den meget mere brugervenlige aggregationsramme .

Det har også den samme ulempe som $where:Medmindre du filtrerer, bliver du nødt til at køre ikke én, men mindst to javascript-funktioner for hvert dokument.

Men MapReduce kan i det mindste køre distribueret, og det kan paralleliseres.

tl;dr:

Brug af Javascript er en sidste udvej for meget usædvanlige forespørgsler, som ikke kan laves med det normale forespørgselssprog, og som kræver adgang til for mange data til at blive implementeret i applikationen. Når det er muligt, gør hvad du vil med de specialiserede værktøjer, du har til rådighed, eller implementer din logik på applikationslaget.



  1. Jeg har brug for et råd om NoSQL/MongoDb og data/modellers struktur

  2. Hvordan udfører man mongo-kommandoer fra bash?

  3. Få data mellem to datoer mongo

  4. Brug af findOne i en loop tager for lang tid i Node.js