14 dingen dy't ik woe dat ik wist foardat ik begon mei MongoDB

De oersetting fan it artikel waard taret op 'e foarjûn fan it begjin fan' e kursus "Net-relasjonele databases".

14 dingen dy't ik woe dat ik wist foardat ik begon mei MongoDB

Hichtepunten:

  • It is ekstreem wichtich om in skema te ûntwikkeljen, ek al is it opsjoneel yn MongoDB.
  • Likemin moatte yndeksen oerienkomme mei jo skema en tagongspatroanen.
  • Mije it brûken fan grutte objekten en grutte arrays.
  • Wês foarsichtich mei MongoDB-ynstellingen, foaral as it giet om feiligens en betrouberens.
  • MongoDB hat gjin query-optimizer, dus jo moatte foarsichtich wêze by it útfieren fan query-operaasjes.

Ik wurke al in hiel lange tiid mei databases, mar ûntduts pas koartlyn MongoDB. D'r binne in pear dingen dy't ik woe dat ik wist foardat ik dermei begon te wurkjen. As in persoan al ûnderfining hat op in bepaald fjild, hawwe se foaropfettings oer wat databases binne en wat se dogge. Yn 'e hoop om it makliker te meitsjen foar oaren om te begripen, presintearje ik in list mei mienskiplike flaters.

It meitsjen fan in MongoDB-tsjinner sûnder autentikaasje

Spitigernôch is MongoDB standert ynstalleare sûnder autentikaasje. Foar in wurkstasjon dat lokaal tagong is, is dizze praktyk normaal. Mar om't MongoDB in systeem mei meardere brûkers is dat graach grutte hoemannichten ûnthâld brûke, sil it better wêze as jo it op in server sette mei safolle mooglik RAM, sels as jo it allinich sille brûke foar ûntwikkeling. Ynstallaasje op 'e tsjinner fia de standertpoarte kin problematysk wêze, foaral as in javascript-koade kin wurde útfierd yn it fersyk (bygelyks, $where as idee foar ynjeksjes).

D'r binne ferskate autentikaasjemetoaden, mar de maklikste is in brûker ID / wachtwurd yn te stellen. Brûk dit idee wylst jo tinke oer fancy autentikaasje basearre op LDAP. As it giet om feiligens, moat MongoDB konstant bywurke wurde, en logs moatte altyd wurde kontrolearre op net autorisearre tagong. Bygelyks, ik graach selektearje in oare haven as de standert haven.

Ferjit net it oanfalsflak te binen oan MongoDB

MongoDB Feiligens Checklist befettet goede tips foar it ferminderjen fan it risiko fan netwurk ynbraak en data leakage. It is maklik om it ôf te poetsen en te sizzen dat in ûntwikkelingstsjinner gjin heech nivo fan feiligens nedich is. It is lykwols net sa ienfâldich en dit jildt foar alle MongoDB-tsjinners. Benammen as d'r gjin twingende reden is om te brûken mapReduce, group of $wêr, Jo moatte it gebrûk fan willekeurige koade yn JavaSkript útskeakelje troch te skriuwen yn it konfiguraasjetriem javascriptEnabled:false. Sûnt gegevensbestannen net fersifere binne yn standert MongoDB, makket it sin om MongoDB mei út te fieren Dedicated User, dy't folsleine tagong hat ta bestannen, mei allinich beheinde tagong ta it en de mooglikheid om de eigen kontrôles foar triemtagong fan it bestjoeringssysteem te brûken.

Flater by it ûntwikkeljen fan it circuit

MongoDB brûkt gjin skema. Mar dit betsjut net dat it skema net nedich is. As jo ​​gewoan dokuminten wolle opslaan sûnder ienich konsekwint patroan, kin it opslaan fan se fluch en maklik wêze, mar it opheljen fan se letter kin lestich wêze. ferrekte hurd.

Klassyk artikel "6 thumbregels foar MongoDB Schema Design" It is in lêzen wurdich, en funksjes lykas Skema Explorer yn it ark fan tredden Studio 3T is it wurdich te brûken foar reguliere kontrôles fan circuits.

Ferjit de sortearring net

It ferjitten fan sortearring kin mear frustraasje feroarsaakje en mear tiid fergrieme dan elke oare ferkearde konfiguraasje. Standert brûkt MongoBD binêre soarte. Mar it is net wierskynlik foar elkenien nuttich te wêzen. Case-sensitive, aksint-sensitive, binêre soarten waarden beskôge as nijsgjirrige anachronismen tegearre mei kralen, kaftans en curly snorren werom yn 'e jierren '80 fan' e foarige ieu. No is har gebrûk net te ferjaan. Yn it echte libben is "motorfyts" itselde as "motorfyts". En "Brittanje" en "Brittanje" binne itselde plak. In lytse letter is gewoan it ekwivalint fan in haadletter fan in haadletter. En lit my net begjinne mei it sortearjen fan diakriten. By it meitsjen fan in databank yn MongoDB, brûk dan aksint-ûngefoelige kollaasje en register, dy't oerienkomme mei de taal en systeem brûkers kultuer. Dit sil it sykjen troch stringgegevens folle makliker meitsje.

Meitsje kolleksjes mei grutte dokuminten

MongoDB is bliid om grutte dokuminten te hostjen oant 16MB yn kolleksjes, en GridFS Untworpen foar grutte dokuminten grutter dan 16 MB. Mar krekt om't grutte dokuminten dêr pleatst wurde kinne, is it opslaan dêr net in goed idee. MongoDB sil it bêste wurkje as jo yndividuele dokuminten opslaan dy't in pear kilobytes yn grutte binne, en behannelje se mear as rigen yn in brede SQL-tabel. Grutte dokuminten sille in boarne fan problemen mei produktiviteit.

It meitsjen fan dokuminten mei grutte arrays

Dokuminten kinne arrays befetsje. It is it bêste as it oantal eleminten yn 'e array fier fan in fjouwer-sifers nûmer is. As eleminten faak wurde tafoege oan in array, sil it útgroeie fan it dokumint dat it befettet en sil moatte wurde bewege, wat betsjut dat it nedich wêze sil update yndeksen ek. By it opnij yndeksearjen fan in dokumint mei in grut array, wurde de yndeksen faak oerskreaun, om't der in in rekord, dy't syn yndeks bewarret. Dizze opnij yndeksearje komt ek foar as in dokumint wurdt ynfoege of wiske.

MongoDB hat wat neamd "fill faktor", dy't romte biedt foar dokuminten om te groeien om dit probleem te minimalisearjen.
Jo kinne tinke dat jo kinne dwaan sûnder array-yndeksearring. Spitigernôch kin it ûntbrekken fan yndeksen jo oare problemen feroarsaakje. Sûnt dokuminten wurde skansearre fan begjin oant ein, sil it sykjen nei eleminten oan 'e ein fan' e array langer duorje, en de measte operaasjes dy't ferbûn binne mei sa'n dokumint stadich.

Ferjit net dat de folchoarder fan 'e stadia yn in aggregaasje wichtich is

Yn in databanksysteem mei in query-optimizer binne de fragen dy't jo skriuwe ferklearrings fan wat jo wolle krije, net hoe't jo it krije. Dit meganisme wurket nei analogy mei it bestellen yn in restaurant: gewoanlik bestelle jo gewoan in skûtel, en jouwe gjin detaillearre ynstruksjes oan 'e kok.

Yn MongoDB ynstruearje jo de kok. Jo moatte bygelyks derfoar soargje dat de gegevens trochgeane reduce sa betiid mooglik yn 'e pipeline mei help $match и $project, en sortearring komt pas nei reduce, en dat it sykjen bart yn krekt de folchoarder dy't jo wolle. It hawwen fan in query optimizer dat elimineert ûnnedich wurk, optimaal sekwinsjes stappen, en selektearje join typen kin bedjerre jo. Mei MongoDB hawwe jo mear kontrôle op kosten fan gemak.

Tools lykas Studio 3T sil de konstruksje fan aggregaasjefragen ferienfâldigje yn MongoDB. De funksje Aggregation Editor lit jo pipeline-útspraken ien poadium tagelyk tapasse, en ynfier- en útfiergegevens by elke poadium ynspektearje om debuggen te ferienfâldigjen.

Mei help fan Quick Recording

Nea ynstelle MongoDB skriuwopsjes om hege snelheid mar lege betrouberens te hawwen. Dizze modus "bestân-en-ferjitte" liket fluch om't it kommando wurdt weromjûn foardat it skriuwen bart. As it systeem crasht foardat de gegevens op skiif skreaun binne, sille se ferlern gean en einigje yn in inkonsistente steat. Gelokkich hat 64-bit MongoDB logging ynskeakele.

De MMAPv1- en WiredTiger-opslachmotoren brûke logging om dit te foarkommen, hoewol WiredTiger kin weromhelje nei de lêste konsistente kontrôle punt, as logging is útskeakele.

Journaling soarget derfoar dat de databank is yn in konsekwinte steat nei herstel en behâldt alle gegevens oant it wurdt skreaun nei it log. De frekwinsje fan opnames wurdt ynsteld mei de parameter commitIntervalMs.

Om wis te wêzen fan de yngongen, soargje derfoar dat logging ynskeakele is yn it konfiguraasjetriem (storage.journal.enabled), en de frekwinsje fan opnames komt oerien mei it bedrach fan ynformaasje dat jo kinne betelje te ferliezen.

Sortearje sûnder yndeks

By it sykjen en aggregearjen is d'r faaks needsaak om gegevens te sortearjen. Litte wy hoopje dat dit wurdt dien yn ien fan 'e lêste stadia, nei it filterjen fan it resultaat om it bedrach fan sorteare gegevens te ferminderjen. En sels yn dit gefal sil jo nedich wêze foar sortearjen yndeks. Jo kinne in inkele of gearstalde yndeks brûke.

As d'r gjin geskikte yndeks is, sil MongoDB sûnder it dwaan. D'r is in ûnthâldlimyt fan 32 MB op 'e totale grutte fan alle dokuminten yn sortearring operaasjes, en as MongoDB dizze limyt berikt, dan sil it in flater smyt of weromkomme lege recordset.

Sykje sûnder yndeksstipe

Sykfragen útfiere in funksje fergelykber mei de JOIN-operaasje yn SQL. Om it bêste te wurkjen, hawwe se de yndeks nedich fan 'e wearde fan' e kaai dy't brûkt wurdt as de frjemde kaai. Dit is net dúdlik, om't it gebrûk net yn wjerspegele wurdt explain(). Sokke yndeksen binne neist de yndeks skreaun explain(), dy't op syn beurt wurdt brûkt troch pipeline operators $match и $sort, as se oan it begjin fan 'e pipeline moetsje. Yndeksen kinne no elke poadium dekke aggregaasje pipeline.

Opjaan foar it brûken fan multi-updates

Metoade db.collection.update() brûkt om in diel fan in besteand dokumint of it hiele dokumint te feroarjen, oant in folsleine ferfanging, ôfhinklik fan de parameter dy't jo oantsjutte update. Wat net sa dúdlik is, is dat it net alle dokuminten yn 'e kolleksje sil ferwurkje, útsein as jo de opsje ynstelle multi om alle dokuminten te aktualisearjen dy't foldogge oan de fersykkritearia.

Ferjit net it belang fan 'e folchoarder fan' e toetsen yn in hash-tabel

Yn JSON, in foarwerp bestiet út in net-oardere kolleksje fan grutte nul of mear namme / wearde pearen, dêr't namme is in tekenrige en wearde is in tekenrige, nûmer, boolean, null, foarwerp, of array.

Spitigernôch leit BSON in protte klam op bestelling by it sykjen. Yn MongoDB, de folchoarder fan toetsen binnen ynboude objekten saken, d.h. { firstname: "Phil", surname: "factor" } - dit is net itselde as { { surname: "factor", firstname: "Phil" }. Dat is, jo moatte de folchoarder fan namme- / weardepearen yn jo dokuminten opslaan as jo wis wolle wêze dat jo se fine.

Wês net betize "Nul" и "ûndefiniearre"

wearde "ûndefiniearre" wie nea jildich yn JSON, neffens offisjele standert JSON (ECMA-404 Seksje 5), ek al wurdt it brûkt yn JavaSkript. Boppedat is it foar BSON ferâldere en wurdt omboud ta $null, dat is net altyd in goede oplossing. Mije it brûken "ûndefiniearre" yn MongoDB.

Gebrûk $limit() sûnder $sort()

Hiel faak as jo yn MongoDB ûntwikkelje, is it handich om gewoan in stekproef te sjen fan it resultaat dat sil wurde weromjûn fan in query of aggregaasje. Foar dizze taak sille jo nedich hawwe $limit(), mar it moat nea yn 'e definitive koade wêze, útsein as jo it earder brûke $sort. Dit monteur is nedich omdat oars kinne jo net garandearje de folchoarder fan it resultaat, en do silst net by steat wêze om te sjen betrouber de gegevens. Oan 'e boppekant fan it resultaat krije jo ferskate yngongen ôfhinklik fan' e sortearring. Om betrouber te wurkjen, moatte queries en aggregaasjes deterministysk wêze, dat is, elke kear deselde resultaten produsearje as se wurde útfierd. Koade dy't befettet $limit(), mar nee $sort, sil net deterministysk wêze en kinne dêrnei flaters feroarsaakje dy't dreech op te spoaren binne.

konklúzje

De ienige manier om teloarsteld te wurden mei MongoDB is it direkt te fergelykjen mei in oare soart databank, lykas in DBMS, of om it te brûken basearre op bepaalde ferwachtingen. It is as in oranje te fergelykjen mei in foarke. Databanksystemen tsjinje spesifike doelen. It is it bêste om dizze ferskillen gewoan foar josels te begripen en te wurdearjen. It soe in skande wêze om de MongoDB-ûntwikkelders te drukken oer in paad dat har it DBMS-paad twong. Ik wol nije en nijsgjirrige manieren sjen om âlde problemen op te lossen, lykas it garandearjen fan gegevensintegriteit en it meitsjen fan gegevenssystemen dy't resistint binne foar mislearring en kweade oanfallen.

MongoDB's yntroduksje fan ACID-transaksjealiteit yn ferzje 4.0 is in goed foarbyld fan it yntrodusearjen fan wichtige ferbetteringen op in ynnovative manier. Transaksjes mei meardere dokuminten en meartalige ferklearrings binne no atoom. It is ek mooglik om de tiid oan te passen dy't nedich is om slûzen te krijen en fêste transaksjes te beëinigjen, en ek it isolaasjenivo te feroarjen.

14 dingen dy't ik woe dat ik wist foardat ik begon mei MongoDB

Lês mear:

Boarne: www.habr.com

Add a comment