De vertaling van het artikel is gemaakt aan de vooravond van de start van de cursus
Hoogtepunten:
- Het is uiterst belangrijk om een schema te ontwikkelen, ook al is dit optioneel in MongoDB.
- Op dezelfde manier moeten indexen overeenkomen met uw schema en toegangspatronen.
- Vermijd het gebruik van grote objecten en grote arrays.
- Wees voorzichtig met MongoDB-instellingen, vooral als het gaat om beveiliging en betrouwbaarheid.
- MongoDB beschikt niet over een query-optimalisatieprogramma, dus u moet voorzichtig zijn bij het uitvoeren van querybewerkingen.
Ik werk al heel lang met databases, maar heb MongoDB pas onlangs ontdekt. Er zijn een paar dingen die ik wou dat ik wist voordat ik ermee begon te werken. Wanneer iemand al ervaring heeft op een bepaald gebied, heeft hij vooroordelen over wat databases zijn en wat ze doen. In de hoop het voor anderen gemakkelijker te maken het te begrijpen, presenteer ik een lijst met veelgemaakte fouten.
Een MongoDB-server maken zonder authenticatie
Helaas wordt MongoDB standaard zonder authenticatie geïnstalleerd. Voor een lokaal toegankelijk werkstation is deze praktijk normaal. Maar aangezien MongoDB een systeem voor meerdere gebruikers is dat graag grote hoeveelheden geheugen gebruikt, is het beter als u het op een server met zoveel mogelijk RAM plaatst, zelfs als u het alleen voor ontwikkeling gaat gebruiken. Installeren op de server via de standaardpoort kan problematisch zijn, vooral als er javascript-code kan worden uitgevoerd in het verzoek (bijvoorbeeld $where
als idee voor
Er zijn verschillende authenticatiemethoden, maar de eenvoudigste is het instellen van een gebruikers-ID/wachtwoord. Gebruik dit idee terwijl u nadenkt over mooie authenticatie op basis van
Vergeet niet het aanvalsoppervlak aan MongoDB te binden
,
of
. Omdat gegevensbestanden niet worden gecodeerd in standaard MongoDB, is het logisch om MongoDB mee uit te voeren
Fout bij het ontwikkelen van het circuit
MongoDB maakt geen gebruik van een schema. Maar dit betekent niet dat het plan niet nodig is. Als u alleen documenten wilt opslaan zonder een consistent patroon, kan het opslaan ervan snel en eenvoudig zijn, maar het later terugvinden ervan kan moeilijk zijn.
Klassiek artikel "
Vergeet de sorteervolgorde niet
Het vergeten van de sorteervolgorde kan meer frustratie veroorzaken en meer tijd verspillen dan elke andere onjuiste configuratie. Standaard gebruikt MongoBD
Creëer collecties met grote documenten
MongoDB host graag grote documenten tot 16 MB in collecties, en
Documenten maken met grote arrays
Documenten kunnen arrays bevatten. Het is het beste als het aantal elementen in de array verre van vier cijfers is. Als er regelmatig elementen aan een array worden toegevoegd, zal deze het document dat de array bevat ontgroeien en dat zal ook nodig zijn
MongoDB heeft iets genaamd
Je zou kunnen denken dat je het zonder array-indexering kunt doen. Helaas kan het ontbreken van indexen ertoe leiden dat u andere problemen ondervindt. Omdat documenten van begin tot eind worden gescand, zal het zoeken naar elementen aan het einde van de array langer duren, en zullen de meeste bewerkingen die aan een dergelijk document zijn gekoppeld, langer duren.
Vergeet niet dat de volgorde van de fasen in een aggregatie van belang is
In een databasesysteem met een query-optimalisatiefunctie zijn de query's die u schrijft een verklaring van wat u wilt verkrijgen, en niet hoe u dit kunt verkrijgen. Dit mechanisme werkt analoog aan het bestellen in een restaurant: meestal bestel je gewoon een gerecht en geef je geen gedetailleerde instructies aan de kok.
In MongoDB instrueer je de kok. U moet er bijvoorbeeld voor zorgen dat de gegevens worden doorgegeven reduce
zo vroeg mogelijk in de pijplijn gebruiken $match
и $project
, en sorteren vindt pas daarna plaats reduce
en dat de zoekopdracht precies in de gewenste volgorde plaatsvindt. Het hebben van een query-optimalisatieprogramma dat onnodig werk elimineert, stappen optimaal opeenvolgt en join-typen selecteert, kan u verwennen. Met MongoDB heeft u meer controle, maar dit gaat ten koste van uw gemak.
Gereedschappen zoals
Snelle opname gebruiken
Stel MongoDB-schrijfopties nooit in op hoge snelheid maar lage betrouwbaarheid. Deze modus "bestand-en-vergeten" lijkt snel omdat de opdracht wordt geretourneerd voordat het schrijven plaatsvindt. Als het systeem crasht voordat de gegevens naar de schijf zijn geschreven, gaan deze verloren en komen ze in een inconsistente toestand terecht. Gelukkig heeft 64-bit MongoDB logboekregistratie ingeschakeld.
De MMAPv1- en WiredTiger-opslagengines gebruiken logboekregistratie om dit te voorkomen, hoewel WiredTiger kan herstellen tot de laatste consistente
Journaling zorgt ervoor dat de database na herstel in een consistente staat verkeert en dat alle gegevens bewaard blijven totdat deze naar het logboek worden geschreven. De frequentie van de opnames wordt geconfigureerd met behulp van de parameter
.
Om zeker te zijn van de gegevens, zorgt u ervoor dat logboekregistratie is ingeschakeld in het configuratiebestand
en de frequentie van de opnames komt overeen met de hoeveelheid informatie die u zich kunt veroorloven te verliezen.
Sorteren zonder index
Bij het zoeken en aggregeren is het vaak nodig om gegevens te sorteren. Laten we hopen dat dit in een van de laatste fasen gebeurt, na het filteren van het resultaat om de hoeveelheid gegevens die wordt gesorteerd te verminderen. En zelfs in dit geval heb je voor het sorteren nodig
Als er geen geschikte index is, zal MongoDB het zonder doen. Er geldt een geheugenlimiet van 32 MB voor de totale grootte van alle documenten in
Zoeken zonder indexondersteuning
Zoekopdrachten voeren een functie uit die vergelijkbaar is met de JOIN-bewerking in SQL. Om het beste te kunnen werken, hebben ze de index nodig van de waarde van de sleutel die als externe sleutel wordt gebruikt. Dit is niet vanzelfsprekend omdat het gebruik er niet in terugkomt explain()
. Dergelijke indices vormen een aanvulling op de index die erin is geschreven explain()
, dat op zijn beurt wordt gebruikt door pijpleidingbeheerders $match
и $sort
, wanneer ze elkaar ontmoeten aan het begin van de pijplijn. Indexen kunnen nu elk stadium bestrijken
Afmelden voor het gebruik van multi-updates
werkwijze
gebruikt om een deel van een bestaand document of het hele document te wijzigen, tot een volledige vervanging, afhankelijk van de parameter die u opgeeft
. Wat niet zo voor de hand liggend is, is dat niet alle documenten in de collectie worden verwerkt, tenzij u de optie instelt
om alle documenten bij te werken die aan de aanvraagcriteria voldoen.
Vergeet het belang van de volgorde van de sleutels in een hashtabel niet
In JSON bestaat een object uit een ongeordende verzameling van grootte nul of meer naam/waarde-paren, waarbij naam een tekenreeks is en waarde een tekenreeks, getal, boolean, null, object of array.
Helaas legt BSON bij het zoeken veel nadruk op volgorde. In MongoDB de volgorde van sleutels binnen ingebouwde objecten { firstname: "Phil", surname: "factor" }
- dit is niet hetzelfde als { { surname: "factor", firstname: "Phil" }
. Dat wil zeggen dat u de volgorde van naam/waarde-paren in uw documenten moet opslaan als u er zeker van wilt zijn dat u ze kunt vinden.
Verwar niet "Nul" и "ongedefinieerd"
Waarde "ongedefinieerd" was volgens. nooit geldig in JSON $null
, wat niet altijd een goede oplossing is.
Gebruiken $limit()
без $sort()
Als u in MongoDB ontwikkelt, is het vaak handig om slechts een voorbeeld te zien van het resultaat dat wordt geretourneerd uit een query of aggregatie. Voor deze taak heb je nodig $limit()
, maar het mag nooit in de definitieve code voorkomen, tenzij u het eerder gebruikt $sort
. Deze monteur is nodig omdat je anders de volgorde van de uitslag niet kunt garanderen en de gegevens niet betrouwbaar kunt inzien. Bovenaan het resultaat krijgt u verschillende vermeldingen, afhankelijk van de sortering. Om betrouwbaar te kunnen werken, moeten query's en aggregaties deterministisch zijn, dat wil zeggen dat ze elke keer dat ze worden uitgevoerd dezelfde resultaten opleveren. Code die bevat $limit()
, maar nee $sort
, zal niet deterministisch zijn en kan vervolgens fouten veroorzaken die moeilijk op te sporen zijn.
Conclusie
De enige manier om teleurgesteld te worden over MongoDB is door het rechtstreeks te vergelijken met een ander type database, zoals een DBMS, of door het te gaan gebruiken op basis van bepaalde verwachtingen. Het is alsof je een sinaasappel met een vork vergelijkt. Databasesystemen dienen specifieke doeleinden. Het is het beste om deze verschillen eenvoudig zelf te begrijpen en te waarderen. Het zou zonde zijn om de MongoDB-ontwikkelaars onder druk te zetten over een pad dat hen op het DBMS-pad dwong. Ik wil nieuwe en interessante manieren zien om oude problemen op te lossen, zoals het waarborgen van data-integriteit en het creëren van datasystemen die bestand zijn tegen mislukkingen en kwaadaardige aanvallen.
MongoDB's introductie van ACID transactionaliteit in versie 4.0 is een goed voorbeeld van het op een innovatieve manier introduceren van belangrijke verbeteringen. Transacties met meerdere documenten en meerdere afschriften zijn nu atomair. Het is ook mogelijk om de tijd aan te passen die nodig is om vergrendelingen te verwerven en vastgelopen transacties te beëindigen, en om het isolatieniveau te wijzigen.
Lees verder:
Bron: www.habr.com