sql >> Databasteknik >  >> NoSQL >> MongoDB

Har Javascript-funktionen på serversidan prestandaproblem i mongoDB?

När du frågar om användbarheten av serversidigt javascript måste du först göra klart vilken typ av serversidigt javascript du pratar om. Enligt dokumentationen , det finns fyra olika typer av serversidig kodexekvering. Tyvärr är de alla slags hackiga lösningar för situationer där det inbyggda API:et är otillräckligt:

evalen kommando

eval har nackdelen att den bara körs på en nod. Detta minskar avsevärt dess användbarhet i en klustrad miljö. Med klippta samlingar fungerar det inte alls!

Som standard skapar den också ett globalt lås som gör databasen helt oanvändbar tills skriptet har körts. Detta kan förhindras med nolock argument (om inte skriptet i sig gör något som skapar ett globalt lås).

Svaret från Sammaye förklarar också några allvarliga säkerhetsproblem.

Det är egentligen mer ett test- och administrationsverktyg än något du bör använda för en vanlig operation.

Köra .js-filer via en mongo shell-instans på servern

I det här fallet exekveras koden inte på databasen, utan snarare på en annan oberoende process på en av servrarna. Detta innebär att all nödvändig data från andra skärvor måste överföras till servern som kör javascript-koden, oavsett vad som faktiskt returneras av skriptet.

Det visas som ett annat program för mongodb-servern, så det kan inte göra något du inte också kunde göra från din vanliga applikation. Det är ytterligare ett test- och administrationsverktyg som du inte bör använda i vanlig drift.

Hitta med $where -operatör

Operatorn $where i ett find-kommando tillåter att skicka en javascript-funktion som används för att filtrera värden. För de flesta triviala fall är detta mycket sämre än vad de andra verktygen i sökfrågan har att erbjuda, särskilt eftersom det inte kan använda några index.

När användningen av $where inte kan undvikas, försök åtminstone att använda några av de vanliga verktygen i sökfrågan för att minska mängden dokument som måste skickas till $where-funktionen.

MapReduce

MapReduce använder två javascript-funktioner för att skapa aggregerad data. Det brukade vara det primära datautvinningsverktyget för MongoDB, men de flesta av dess vanliga användningsfall är nu uppfyllda av den mycket mer användarvänliga aggregationsramverk .

Det har också samma nackdel som $where:Om du inte filtrerar måste du köra inte en utan minst två JavaScript-funktioner för varje dokument.

Men MapReduce kan åtminstone köras distribuerat och det kan parallelliseras.

tl;dr:

Att använda Javascript är en sista utväg för mycket ovanliga frågor som inte kan göras med det vanliga frågespråket och som kräver tillgång till för mycket data för att kunna implementeras i applikationen. När det är möjligt, gör vad du vill göra med de specialiserade verktyg du har tillgängliga eller implementera din logik på applikationslagret.



  1. MongoDB findAndModify från flera klienter

  2. Implementera autoslutförande på MongoDB

  3. Kopiera mapp med jokertecken från docker-behållare till värd

  4. MongoDB uppdaterar arrayobjekt inom en array