De vertaling van het artikel is voorbereid ter voorbereiding op de start van de cursus .

Belangrijke punten:
- Het is uiterst belangrijk om een schema te ontwikkelen, hoewel het in MongoDB niet verplicht is.
- Evenzo moeten indexen overeenkomen met uw schema en toegangspatronen.
- Vermijd het gebruik van grote objecten en grote arrays.
- Wees voorzichtig met de instellingen van MongoDB, vooral als het gaat om beveiliging en betrouwbaarheid.
- MongoDB heeft geen query-optimalisator, dus u moet voorzichtig zijn bij het uitvoeren van query-operaties.
Ik werk al lange tijd met databases, maar heb pas onlangs MongoDB ontdekt. Er zijn een paar dingen die ik zou willen weten voordat ik ermee aan de slag ga. Wanneer iemand al ervaring heeft in een bepaald gebied, heeft hij vooringenomen ideeƫn over wat databases zijn en wat ze doen. In de hoop het begrip voor anderen te vergemakkelijken, presenteer ik een lijst van veelgemaakte fouten.
Een MongoDB-server opzetten zonder authenticatie
Helaas wordt MongoDB standaard geĆÆnstalleerd zonder authenticatie. Voor een werkstation dat lokaal toegankelijk is, is deze praktijk normaal. Maar aangezien MongoDB een multi-user systeem is dat graag grote hoeveelheden geheugen gebruikt, is het beter om het op een server te plaatsen met zoveel mogelijk RAM onder uw omstandigheden, zelfs als u het alleen voor ontwikkeling gaat gebruiken. Installatie op een server via de standaardpoort kan problematisch zijn, vooral als in de aanvraag willekeurige JavaScript-code kan worden uitgevoerd (bijvoorbeeld, $where als een idee voor ).
Er zijn verschillende methoden voor authenticatie, maar de eenvoudigste is om een gebruiker een ID/wachtwoord te geven. Gebruik dit idee terwijl u nadenkt over een ingewikkeldere authenticatie op basis van . Wat betreft beveiliging moet MongoDB regelmatig worden bijgewerkt en moeten logs altijd worden gecontroleerd op ongeautoriseerde toegang. Persoonlijk kies ik graag een andere poort als standaardpoort.
Vergeet niet de aanvalsvector aan MongoDB te binden
bevat goede tips om het risico op netwerkdoorbraken en gegevenslekken te verminderen. Het is gemakkelijk om te zeggen dat een ontwikkelingsserver geen hoog beveiligingsniveau nodig heeft. Maar zo simpel is het niet en dit geldt voor alle MongoDB-servers. Vooral als er geen goede reden is om te gebruiken , of , moet het gebruik van willekeurige JavaScript-code worden uitgeschakeld door dit in het configuratiebestand te schrijven . Aangezien de standaard MongoDB-gegevensbestanden niet zijn versleuteld, is het verstandig om MongoDB te draaien met , die volledige toegang heeft tot de bestanden, met beperkte toegang alleen voor hemzelf en de mogelijkheid om zijn eigen bestandsbeheer van het besturingssysteem te gebruiken.
Fout bij het ontwerpen van de schema
MongoDB gebruikt geen schema. Maar dat betekent niet dat een schema niet nodig is. Als je alleen documenten wilt opslaan zonder een samenhangend schema, dan kun je dat snel en eenvoudig doen, maar het kan .
Het klassieke artikel " is het lezen waard, en functies zoals in de externe tool Studio 3T zijn nuttig voor regelmatige schema-controles.
Vergeet de sorteerorde niet
Vergeten van de sorteerorde kan je het meeste frustreren en meer tijd kosten dan het gebruik van enige andere verkeerde configuratie. Standaard gebruikt MongoBD . Maar het zal weinig nuttig zijn voor iemand. Hoofdlettergevoelige, diakritische, binaire sorteringen werden in de jaren '80 al beschouwd als nieuwsgierige anachronismen die bij kralen, kaftans en krullende snorren horen. Nu is hun gebruik onvergeeflijk. In het echte leven is "motorfiets" hetzelfde als "Motorfiets". En "Britanniƫ" en "britanniƫ" zijn dezelfde plaats. Een kleine letter is gewoon de hoofdletterequivalent. En laat me niet beginnen over de sortering van diakritische tekens. Wanneer je een database in MongoDB maakt, gebruik dan sorteerparameters zonder diakritiek en , die passen bij de taal en . Zo maak je het zoeken naar stringgegevens een stuk eenvoudiger.
Collecties met grote documenten maken
MongoDB biedt de mogelijkheid om grote documenten tot 16 MB op te slaan in collecties, terwijl is ontworpen voor documenten die groter zijn dan 16 MB. Maar alleen omdat je grote documenten daar kunt opslaan, is het niet altijd de beste keuze om ze daar te bewaren. MongoDB werkt het beste wanneer je aparte documenten van enkele kilobytes opslaat, beschouw ze meer als rijen in een brede SQL-tabel. Grote documenten kunnen problemen opleveren met .
Het creƫren van documenten met grote arrays
Documenten kunnen arrays bevatten. Het is het beste als het aantal elementen in de array ver van een viercijferig getal ligt. Als er vaak elementen aan de array worden toegevoegd, groeit deze voorbij het document dat het bevat, en zal het moeten worden , wat betekent dat je moet . Bij het opnieuw indexeren van een document met een grote array, worden de indexen vaak overschreven, omdat er voor elk element een , die zijn index opslaat. Een dergelijke herindexering vindt ook plaats wanneer een document wordt ingevoegd of verwijderd.
In MongoDB is er een zogenaamd , dat ruimte biedt voor de groei van documenten om dit probleem tot een minimum te beperken.
Je zou kunnen denken dat je zonder indexering van arrays kunt. Helaas kunnen door het ontbreken van indexen andere problemen ontstaan. Omdat documenten van begin tot eind worden doorzocht, kost het meer tijd om elementen aan het einde van de array te vinden, en de meeste operaties met betrekking tot zo'n document zullen .
Vergeet niet dat de volgorde van de stadia in aggregatie belangrijk is
In een databasesysteem met een query-optimizer zijn de queries die je schrijft een uitleg van wat je wilt krijgen, niet hoe je het wilt krijgen. Dit werkt als een bestelling in een restaurant: doorgaans bestel je gewoon een gerecht in plaats van gedetailleerde instructies aan de kok te geven.
In MongoDB geef je instructies aan de kok. Zorg er bijvoorbeeld voor dat de gegevens zo vroeg mogelijk in de pijplijn gaan door middel van reduce $match en en $project, en dat sortering pas later plaatsvindt. reduce, en dat de zoekopdracht precies in de volgorde plaatsvindt die u nodig heeft. Het hebben van een query-optimalisator die overbodig werk wegneemt, de stappen optimaal ordent en het type verbinding kiest, kan u verwennen. In MongoDB krijgt u meer controle ten koste van gebruiksgemak.
Tools zoals vereenvoudigen het opstellen van aggregatiequeries in . De functie Aggregation Editor stelt u in staat om pipeline-operators ƩƩn voor ƩƩn toe te passen, en om invoer- en uitvoergegevens op elke stap te controleren voor een vereenvoudigde debugging.
Gebruik van snelle schrijfmodus
Stel nooit hoge-snelheid schrijfinstellingen in MongoDB in met lage betrouwbaarheid. Deze modus āfile-and-forgetā lijkt snel, omdat de opdracht wordt teruggegeven voordat de schrijfopdracht is uitgevoerd. Als het systeem crasht voordat de gegevens op schijf zijn geschreven, gaan ze verloren en kunnen ze inconsistent zijn. Gelukkig is logboekregistratie ingeschakeld in 64-bits MongoDB.
De opslagengines MMAPv1 en WiredTiger gebruiken logboekregistratie om dit te voorkomen, hoewel WiredTiger kan herstellen tot het laatste consistente , als de logboekregistratie is uitgeschakeld.
Logboekregistratie garandeert dat de database in een consistente toestand verkeert na herstel en houdt alle gegevens vast tot het moment van registratie in het logboek. De frequentie van registraties kan worden ingesteld met de parameter .
Om zeker te zijn van registraties, zorg ervoor dat logboekregistratie in het configuratiebestand is ingeschakeld ), en dat de frequentie van registraties overeenkomt met de hoeveelheid informatie die u zich kunt veroorloven te verliezen.
Sorteren zonder index
Bij het zoeken en aggregeren is er vaak behoefte aan het sorteren van gegevens. Laten we hopen dat dit op een van de laatste stappen gebeurt, na het filteren van de resultaten om de hoeveelheid te sorteren gegevens te verminderen. En zelfs dan heeft u voor het sorteren een index nodig. U kunt een enkele of samengestelde index gebruiken.
Als er geen geschikte index is, kan MongoDB er zonder. Er is een geheugenlimiet van 32 MB voor de totale grootte van alle documenten in , en als MongoDB deze limiet bereikt, zal het ofwel een foutmelding geven, of een .
Zoeken zonder indexondersteuning
Zoekopdrachten vervullen een functie die vergelijkbaar is met de JOIN-operatie in SQL. Voor een betere werking hebben ze een index van de waarde van de sleutel nodig die als externe sleutel wordt gebruikt. Dit is niet voor de hand liggend, omdat het gebruik niet wordt weerspiegeld in explain(). Dergelijke indexen zijn een aanvulling op de index die is vastgelegd in explain(), die op zijn beurt wordt gebruikt door de pijplijnoperators en en $sort, wanneer deze aan het begin van de pijplijn verschijnen. Indexen kunnen nu elke fase dekken .
Afstappen van multi-updates
Methode wordt gebruikt om een deel van een bestaand document of een heel document te wijzigen, tot volledige vervanging afhankelijk van de door u ingestelde parameter . Het is niet zo voor de hand liggend dat het niet alle documenten in de collectie zal verwerken, tenzij u de parameter instelt om alle documenten die aan de zoekcriteria voldoen bij te werken.
Vergeet niet belang van de volgorde van sleutels in een hash-tabel
In JSON is een object een ongeordende collectie van nul of meer naam/waarde-paren, waarbij de naam een string is en de waarde een string, nummer, boolean, nul, object of array kan zijn.
Helaas hecht BSON veel waarde aan de volgorde tijdens de zoekopdrachten. In MongoDB is de volgorde van sleutels binnen geneste objecten , d.w.z. { firstname: "Phil", surname: "factor" } niet hetzelfde als { { surname: "factor", firstname: "Phil" }. Dit betekent dat u de volgorde van naam/waarde-paren in documenten moet behouden als u zeker wilt zijn dat u ze vindt.
Verwarring tussen "null" en "undefined"
Waarde "undefined" is nooit toegestaan in JSON, volgens JSON (ECMA-404, Sectie 5), ondanks dat het in JavaScript wordt gebruikt. Bovendien is het verouderd voor BSON en wordt het omgezet in $null, wat niet altijd een goede oplossing is. .
Gebruik van $limit() zonder $sort()
Heel vaak, wanneer u ontwikkelt in MongoDB, is het handig om gewoon een voorbeeldresultaat te zien dat terugkomt van een query of aggregatie. Voor deze taak kunt u gebruik maken van $limit(), maar het zou nooit in de eindversie van de code moeten staan, tenzij u het vooraf laat volgen door $sort. Deze mechaniek is nodig, omdat je anders de volgorde van resultaten niet kunt garanderen en geen betrouwbare gegevensweergave kunt krijgen. Bovenaan de resultaten ontvang je verschillende records afhankelijk van de sortering. Voor betrouwbare werking moeten verzoeken en aggregaties deterministisch zijn, dat wil zeggen dezelfde resultaten bij elke uitvoering opleveren. Code waarin er $limit(), maar geen $sort, zal niet deterministisch zijn en kan later fouten veroorzaken die moeilijk te traceren zijn.
Conclusie
De enige manier om teleurgesteld te zijn in MongoDB, is door het direct te vergelijken met een ander type database, zoals een relationele database, of door gebruik te maken van bepaalde verwachtingen. Het is alsof je een sinaasappel met een vork vergelijkt. Databasesystemen hebben verschillende doelen. Het is het beste om deze verschillen gewoon te begrijpen en voor jezelf te waarderen. Het zou zonde zijn om de ontwikkelaars van MongoDB onder druk te zetten vanwege de weg die hen heeft geleid naar relationele databases. Ik zou graag nieuwe en interessante manieren willen zien om oude problemen op te lossen, zoals het waarborgen van gegevensintegriteit en het creƫren van veerkrachtige datasystemen tegen storingen en aanvallen van kwaadwillenden.
De implementatie van ACID-transacties in MongoDB versie 4.0 is een goed voorbeeld van hoe belangrijke verbeteringen innovatief kunnen worden doorgevoerd. Multi-document en multi-operator transacties zijn nu atomair. Er is nu ook de mogelijkheid om de tijd te regelen die nodig is om locks te verkrijgen en om vastgelopen transacties te beƫindigen, evenals het aanpassen van het isolatieniveau.
Lees meer:
Bron: habr.com
