ĂversĂ€ttningen av artikeln Ă€r framtagen inför kursstarten .

Huvudpunkter:
- Det Àr mycket viktigt att utforma en skiss, Àven om det inte Àr obligatoriskt i MongoDB.
- PÄ samma sÀtt bör indexen matcha din skiss och Ätkomstmönster.
- Undvik att anvÀnda stora objekt och stora arrayer.
- Var försiktig med instÀllningarna i MongoDB, speciellt nÀr det gÀller sÀkerhet och pÄlitlighet.
- Det finns ingen frÄgaoptimerare i MongoDB, sÄ var försiktig nÀr du utför förfrÄgningsoperationer.
Jag har arbetat med databaser lÀnge, men upptÀckte MongoDB först nyligen. Det finns nÄgra saker som jag önskar att jag hade vetat innan jag började anvÀnda den. NÀr man har erfarenhet inom ett specifikt omrÄde, fÄr man förutfattade meningar om vad databaser Àr och vad de gör. För att underlÀtta förstÄelsen för andra, presenterar jag en lista över vanliga misstag.
Att skapa en MongoDB-server utan autentisering
TyvÀrr installeras MongoDB som standard utan autentisering. För en arbetsstation med lokal Ätkomst Àr detta normalt. Men eftersom MongoDB Àr ett flervalsystem som gÀrna anvÀnder stora mÀngder minne, Àr det bÀttre att installera den pÄ en server med sÄ mycket RAM som möjligt, Àven om du bara ska anvÀnda den för utveckling. Installation pÄ server genom standardport kan bli problematisk, sÀrskilt om förfrÄgningar kan utföra vilken kod som helst pÄ javascript (t.ex. $where som idé för ).
Det finns flera autentiseringsmetoder, men det enklaste Àr att stÀlla in ID/lösenord för anvÀndaren. AnvÀnd denna idé medan du funderar pÄ en mer invecklad autentisering baserad pÄ . NÀr det kommer till sÀkerhet bör MongoDB hÄllas uppdaterad, och loggar bör alltid kontrolleras för obehörig Ätkomst. Jag gillar till exempel att vÀlja en annan port Àn standardporten.
Glöm inte att koppla attackytan till MongoDB
InnehÄller bra rÄd för att minska risken för nÀtintrÄng och datalÀckor. Det Àr lÀtt att avfÀrda och sÀga att en utvecklingsserver inte behöver hög sÀkerhetsnivÄ. Men det Àr inte sÄ enkelt och detta gÀller alla MongoDB-servrar. SÀrskilt om det inte finns nÄgon stark anledning att anvÀnda , eller , bör anvÀndningen av godtycklig JavaScript-kod stÀngas av genom att ange detta i konfigurationsfilen . Eftersom standard MongoDB-datafiler inte Àr krypterade, Àr det rimligt att köra MongoDB med , som har full Ätkomst till filerna, med begrÀnsad Ätkomst endast för sig sjÀlv och möjlighet att anvÀnda sina egna Ätkomstkontrollverktyg i operativsystemet.
Fel vid schemadesign
MongoDB anvÀnder ingen schema. Men det betyder inte att schema Àr onödigt. Om du bara vill lagra dokument utan nÄgon sammanhÀngande schema, kan du snabbt och enkelt spara dem, men att extrahera dem senare kan vara .
Den klassiska artikeln â Ă€r vĂ€rt att lĂ€sa, och funktioner som i det externa verktyget Studio 3T, Ă€r vĂ€rt att anvĂ€nda för regelbundna schemakontroller.
Glöm inte bort sorteringsordningen
Att glömma bort sorteringsordningen kan leda till stor besvikelse och förlora mer tid Àn med nÄgon annan felaktig konfiguration. Som standard anvÀnder MongoDB . Men det Àr osannolikt att det Àr till nÄgon nytta. SkiftlÀgeskÀnsliga, diakritiska, binÀra sorteringar ansÄgs vara underliga anachronismer tillsammans med pÀrlor, kaftaner och krullade mustascher redan pÄ 80-talet. Nu Àr deras anvÀndning oförlÄtlig. I verkliga livet Àr "motorcykel" samma sak som "Motorcykel". Och "Britania" och "britania" Àr samma plats. Liten bokstav Àr helt enkelt en versal motsvarighet. Och lÄt mig inte ens börja prata om sortering av diakritiska tecken. NÀr du skapar en databas i MongoDB, anvÀnd sorteringsalternativ utan hÀnsyn till diakritiska och , som motsvarar sprÄket och . Detta gör det betydligt enklare att söka bland strÀngdata.
Att skapa samlingar med stora dokument
MongoDB kan hantera stora dokument pÄ upp till 16 MB i samlingar, och Àr avsedd för dokument som Àr större Àn 16 MB. Men bara för att stora dokument kan lagras dÀr, betyder det inte att det Àr en bra idé att lagra dem dÀr. MongoDB fungerar bÀst om du sparar enskilda dokument som Àr nÄgra kilobyte stora, och behandlar dem mer som rader i en bred SQL-tabell. Stora dokument kan orsaka problem med .
Att skapa dokument med stora matriser
Dokument kan innehÄlla arrayer. Det Àr bÀst om antalet element i arrayen Àr lÄngt ifrÄn tusentals. Om element ofta lÀggs till i arrayen kan den överskrida det dokument som innehÄller den, och dÄ mÄste den , vilket innebÀr att du behöver . Vid omindexering av ett dokument med en stor array skrivs indexen ofta över, eftersom det finns , som lagrar dess index. SÄdan omindexering sker ocksÄ nÀr dokumentet infogas eller tas bort.
I MongoDB finns det sÄ kallat , som ger utrymme för att dokumenten ska vÀxa för att minimera detta problem.
Du kan tÀnka att det gÄr bra utan att indexera arrayer. TyvÀrr kan bristen pÄ index leda till andra problem. Eftersom dokumenten genomgÄs frÄn början till slut, kommer sökningar efter element i slutet av arrayen att ta mer tid, och de flesta operationer som rör sÄdana dokument kommer att vara .
Kom ihÄg att ordningen för stegen i aggregation Àr viktig
I en databas med en frÄgeoptimerare Àr de frÄgor du skriver förklaringar av vad du vill ha, och inte hur du vill ha det. Den hÀr mekanismen fungerar pÄ ett sÀtt som liknar att lÀgga en bestÀllning i en restaurang: vanligtvis bestÀller du bara en rÀtt, snarare Àn att ge detaljerade instruktioner till kocken.
I MongoDB instruerar du kocken. Till exempel, se till att data passerar genom reduce sÄ tidigt som möjligt i pipelinen med hjÀlp av $match och $project, och sorteringen sker först efterÄt. reduce, och att sökningen sker precis i den ordning som du behöver. Att ha en frÄgeoptimerare som tar bort onödigt arbete, optimerar stegen och vÀljer typ av anslutning kan vara en lyx. I MongoDB fÄr du mer kontroll till priset av bekvÀmlighet.
Verktyg som förenklar konstruktionen av aggregationsfrÄgor i . Aggregation Editor-funktionen lÄter dig tillÀmpa pipeline-operatörer steg för steg och kontrollera ingÄngs- och utdata i varje steg för att förenkla felsökning.
AnvÀndning av snabb skrivning
Installera aldrig höghastighetsinloggningsinstÀllningar i MongoDB med lÄg tillförlitlighet. Detta lÀge «file-and-forget» verkar snabbt eftersom kommandot ÄtervÀnder innan skrivningen genomförs. Om systemet kraschar innan data skrivs till disken gÄr de förlorade och hamnar i ett inkonsekvent tillstÄnd. Lyckligtvis ingÄr journalföring i 64-bitars MongoDB.
Lagringsmotorerna MMAPv1 och WiredTiger anvÀnder journalföring för att förhindra detta, Àven om WiredTiger kan ÄterhÀmta sig till den senaste konsekventa , om journalföringen stÀngs av.
Journalföring garanterar att databasen Àr i ett konsekvent tillstÄnd efter ÄterstÀllning och behÄller all data fram till den tidpunkt dÄ den loggas. Frekvensen för loggning stÀlls in med parametern .
För att vara sÀker pÄ inloggningar, se till att journalföringen Àr aktiverad i konfigurationsfilen ), och att loggningsfrekvensen motsvarar den mÀngd information som du har rÄd att förlora.
Sortering utan index
Vid sökning och aggregering uppstÄr ofta behovet av att sortera data. Förhoppningsvis görs detta vid ett av de slutliga stegen, efter att resultatet har filtrerats för att minska volymen av sorterad data. Och Àven i sÄ fall behöver du . Du kan anvÀnda ett enkelt eller sammansatt index.
Om det inte finns nÄgot lÀmpligt index kan MongoDB klara sig utan det. Det finns en minnesbegrÀnsning pÄ 32 MB för den totala storleken pÄ alla dokument i , och om MongoDB nÄr denna grÀns kommer den antingen att ge ett felmeddelande eller returnera .
Sökning utan indexstöd
SökfrÄgor utför en funktion som liknar JOIN-operationen i SQL. För att fungera bÀttre behöver de en index för nyckelvÀrdet som anvÀnds som en extern nyckel. Detta Àr inte uppenbart, eftersom anvÀndningen inte Äterspeglas i explain(). SÄdana index Àr ett komplement till indexet som Àr skrivet i explain(), vilket i sin tur anvÀnds av pipelineoperatörer $match och $sort, nÀr de upptrÀder i början av pipelinen. Index kan nu omfatta vilken fas som helst .
AvstÄ frÄn att anvÀnda fleruppdateringar
Metod som anvÀnds för att Àndra en del av ett befintligt dokument eller hela dokumentet, upp till fullstÀndig ersÀttning beroende pÄ det parameter du angivit . Det Àr inte sÄ uppenbart att det inte kommer att bearbeta alla dokument i samlingen, förrÀn du stÀller in parametern för att uppdatera alla dokument som uppfyller sökkriterierna.
TÀnk pÄ vikten av ordningen pÄ nycklar i hash-tabellen.
I JSON bestÄr ett objekt av en osorterad samling som innehÄller noll eller fler namn/vÀrde-par, dÀr namnet Àr en strÀng och vÀrdet Àr en strÀng, ett nummer, ett booleskt vÀrde, noll, ett objekt eller en array.
TyvÀrr lÀgger BSON stor vikt vid ordningen vid sökning. I MongoDB har ordningen pÄ nycklar inne i inbÀddade objekt , dvs. { firstname: "Phil", surname: "factor" } Àr inte detsamma som { { surname: "factor", firstname: "Phil" }. Det betyder att du mÄste behÄlla ordningen pÄ namn/vÀrde-par i dokumenten om du vill vara sÀker pÄ att du hittar dem.
FörvÀxla inte «null» och «undefined»
VÀrde «undefined» har aldrig varit tillÄtet i JSON, enligt JSON (ECMA-404, Sektion 5), trots att det anvÀnds i JavaScript. Dessutom Àr det för BSON förÄldrat och konverteras till $null, vilket inte alltid Àr en bra lösning. .
AnvÀndning $limit() utan $sort()
Mycket ofta, nÀr du utvecklar i MongoDB, Àr det bra att se ett exempel pÄ resultatet som kommer att returneras frÄn en frÄga eller aggregation. För detta ÀndamÄl kommer du att ha nytta av $limit(), men det bör aldrig finnas i den slutliga versionen av koden, sÄvida du inte anvÀnder det framför $sort. Den hÀr mekanismen Àr nödvÀndig eftersom du annars inte kan garantera resultatordningen och inte kan utföra pÄlitliga datavisningar. I den övre delen av resultatet kommer du att fÄ olika poster beroende pÄ sortering. För att fungera pÄlitligt mÄste frÄgor och aggregeringar vara deterministiska, det vill sÀga ge samma resultat varje gÄng de körs. Kod som har $limit(), men inte $sort, kommer inte att vara deterministisk och kan senare orsaka fel som Àr svÄra att spÄra.
Slutsats
Det enda sÀttet att bli besviken pÄ MongoDB Àr att jÀmföra den direkt med en annan typ av databas, sÄsom RDBMS, eller att nÀrma sig anvÀndningen utifrÄn vissa förvÀntningar. Det Àr som att jÀmföra en apelsin med en gaffel. Databassystem har specifika mÄl. Det Àr bÀst att bara förstÄ och uppskatta dessa skillnader för sig sjÀlv. Det skulle vara en skam att pressa utvecklarna av MongoDB för vÀgen de tvingades gÄ med RDBMS. Jag vill se nya och intressanta sÀtt att lösa gamla problem, som att sÀkerstÀlla dataintegritet och att skapa datorsystem som Àr motstÄndskraftiga mot fel och attacker frÄn illvilliga aktörer.
Implementeringen av ACID-transaktionalitet i MongoDB version 4.0 Àr ett bra exempel pÄ hur viktiga förbÀttringar kan införas pÄ ett innovativt sÀtt. Multidokument- och multioperationstransaktioner Àr nu atomÀra. Möjligheten att reglera den tid som behövs för att fÄ lÄs och avsluta hÀngande transaktioner, samt att Àndra isoleringsnivÄn, har ocksÄ lagts till.
LĂ€s mer:
KĂ€lla: habr.com
