14 dinge wat ek wens ek geweet het voordat ek met MongoDB begin het

Die vertaling van die artikel is voorberei op die vooraand van die aanvang van die kursus "Nie-relasionele databasisse".

14 dinge wat ek wens ek geweet het voordat ek met MongoDB begin het

hoogtepunte:

  • Dit is uiters belangrik om 'n skema te ontwikkel al is dit opsioneel in MongoDB.
  • Net so moet indekse ooreenstem met jou skema en toegangspatrone.
  • Vermy die gebruik van groot voorwerpe en groot skikkings.
  • Wees versigtig met MongoDB-instellings, veral wanneer dit kom by sekuriteit en betroubaarheid.
  • MongoDB het nie 'n navraagoptimeerder nie, so jy moet versigtig wees wanneer jy navraagbewerkings uitvoer.

Ek werk al baie lank met databasisse, maar het MongoDB eers onlangs ontdek. Daar is 'n paar dinge wat ek wens ek het geweet voordat ek daarmee begin werk het. Wanneer 'n persoon reeds ondervinding in 'n sekere veld het, het hulle vooropgestelde idees oor wat databasisse is en wat hulle doen. In die hoop om dit vir ander makliker te maak om te verstaan, bied ek 'n lys van algemene foute aan.

Skep 'n MongoDB-bediener sonder verifikasie

Ongelukkig word MongoDB by verstek sonder verifikasie geïnstalleer. Vir 'n werkstasie wat plaaslik toegang verkry, is hierdie praktyk normaal. Maar aangesien MongoDB 'n multi-gebruiker stelsel is wat daarvan hou om groot hoeveelhede geheue te gebruik, sal dit beter wees as jy dit op 'n bediener sit met soveel RAM as moontlik, selfs al gaan jy dit net vir ontwikkeling gebruik. Installering op die bediener via die verstekpoort kan problematies wees, veral as enige javascript-kode in die versoek uitgevoer kan word (byvoorbeeld, $where as 'n idee vir inspuitings).

Daar is verskeie verifikasiemetodes, maar die maklikste is om 'n gebruiker-ID/wagwoord in te stel. Gebruik hierdie idee terwyl jy dink oor fancy verifikasie gebaseer op LDAP. Wat sekuriteit betref, moet MongoDB voortdurend opgedateer word, en logs moet altyd nagegaan word vir ongemagtigde toegang. Byvoorbeeld, ek hou daarvan om 'n ander poort as die verstekpoort te kies.

Moenie vergeet om jou aanvaloppervlak aan MongoDB te bind nie

MongoDB Veiligheidskontrolelys bevat goeie wenke om die risiko van netwerkindringing en datalekkasie te verminder. Dit is maklik om dit af te borsel en te sê dat 'n ontwikkelingsbediener nie 'n hoë vlak van sekuriteit nodig het nie. Dit is egter nie so eenvoudig nie en dit geld vir alle MongoDB-bedieners. Veral as daar geen dwingende rede is om te gebruik nie mapReduce, group of $waar, moet jy die gebruik van arbitrêre kode in JavaScript deaktiveer deur in die konfigurasielêer te skryf javascriptEnabled:false. Aangesien datalêers nie in standaard MongoDB geïnkripteer is nie, is dit sinvol om MongoDB mee te laat loop Toegewyde gebruiker, wat volle toegang tot lêers het, met slegs beperkte toegang daartoe en die vermoë om die bedryfstelsel se eie lêertoegangskontroles te gebruik.

Fout tydens die ontwikkeling van die stroombaan

MongoDB gebruik nie 'n skema nie. Maar dit beteken nie dat die skema nie nodig is nie. As jy net dokumente wil stoor sonder enige konsekwente patroon, kan dit vinnig en maklik wees om dit te stoor, maar dit kan moeilik wees om dit later te herwin. vrek moeilik.

Klassieke artikel "6 Duimreëls vir MongoDB-skema-ontwerp" Dit is die moeite werd om te lees, en kenmerke soos Skema Explorer in die derdeparty-instrument Studio 3T, is dit die moeite werd om te gebruik vir gereelde kontrole van stroombane.

Moenie die sorteervolgorde vergeet nie

As u sorteervolgorde vergeet, kan dit meer frustrasie veroorsaak en meer tyd mors as enige ander verkeerde konfigurasie. By verstek gebruik MongoBD binêre sorteer. Maar dit is onwaarskynlik dat dit vir enigiemand nuttig sal wees. Hooflettergevoelige, aksent-sensitiewe, binêre soorte is in die 80's van die vorige eeu saam met krale, kaftans en krullerige snorre beskou as nuuskierige anachronismes. Nou is hul gebruik onvergeeflik. In die werklike lewe is "motorfiets" dieselfde as "motorfiets". En "Brittanje" en "Brittanje" is dieselfde plek. 'n Kleinletter is bloot die hoofletter-ekwivalent van 'n hoofletter. En moenie my begin om diakritiese tekens te sorteer nie. Wanneer u 'n databasis in MongoDB skep, gebruik aksent-onsensitiewe versameling en registreer, wat ooreenstem met die taal en stelselgebruikerskultuur. Dit sal dit baie makliker maak om deur stringdata te soek.

Skep versamelings met groot dokumente

MongoDB is gelukkig om groot dokumente tot 16MB in versamelings aan te bied, en GridFS Ontwerp vir groot dokumente groter as 16 MB. Maar net omdat groot dokumente daar geplaas kan word, is dit nie 'n goeie idee om dit daar te stoor nie. MongoDB sal die beste werk as jy individuele dokumente stoor wat 'n paar kilogrepe groot is, wat hulle meer soos rye in 'n wye SQL-tabel behandel. Groot dokumente sal 'n bron van probleme met produktiwiteit.

Skep dokumente met groot skikkings

Dokumente kan skikkings bevat. Dit is die beste as die aantal elemente in die skikking ver van 'n viersyfergetal is. As elemente gereeld by 'n skikking gevoeg word, sal dit die dokument wat dit bevat ontgroei en sal moet word beweeg, wat beteken dit sal nodig wees werk indekse ook op. Wanneer 'n dokument met 'n groot skikking herindekseer word, sal die indekse dikwels oorskryf word, aangesien daar 'n 'n rekord, wat sy indeks stoor. Hierdie herindeksering vind ook plaas wanneer 'n dokument ingevoeg of uitgevee word.

MongoDB het iets genoem "vul faktor", wat ruimte bied vir dokumente om te groei om hierdie probleem te minimaliseer.
Jy dink dalk dat jy sonder skikkingsindeksering kan klaarkom. Ongelukkig kan die gebrek aan indekse veroorsaak dat jy ander probleme het. Aangesien dokumente van begin tot einde geskandeer word, sal soek na elemente aan die einde van die skikking langer neem, en die meeste bewerkings wat met so 'n dokument geassosieer word, sal stadig.

Moenie vergeet dat die volgorde van die stadiums in 'n samevoeging saak maak nie

In 'n databasisstelsel met 'n navraagoptimeerder, is die navrae wat jy skryf verduidelikings van wat jy wil kry, nie hoe om dit te kry nie. Hierdie meganisme werk na analogie van om in 'n restaurant te bestel: gewoonlik bestel jy bloot 'n gereg, en gee nie gedetailleerde instruksies aan die kok nie.

In MongoDB gee jy die kok opdrag. Byvoorbeeld, jy moet seker maak dat die data deurgaan reduce so vroeg as moontlik in die pyplyn gebruik $match и $project, en sortering vind eers na reduce, en dat die soektog gebeur in presies die volgorde wat jy wil hê. As u 'n navrae-optimaliseerder het wat onnodige werk uitskakel, stappe optimaal opvolg en aansluittipes kies, kan dit u bederf. Met MongoDB het jy meer beheer ten koste van gerief.

Gereedskap soos Studio 3T sal die konstruksie van samevoegingsnavrae in MongoDB. Die samevoegingredigeerder-funksie laat jou toe om pyplynstellings een stadium op 'n slag toe te pas, en inset- en uitvoerdata by elke stadium te inspekteer vir makliker ontfouting.

Gebruik Quick Recording

Moet nooit MongoDB-skryfopsies stel om hoë spoed maar lae betroubaarheid te hê nie. Hierdie modus "lêer-en-vergeet" lyk vinnig omdat die opdrag teruggestuur word voordat die skryf plaasvind. As die stelsel ineenstort voordat die data op skyf geskryf is, sal dit verlore gaan en in 'n inkonsekwente toestand beland. Gelukkig het 64-bis MongoDB aanteken geaktiveer.

Die MMAPv1- en WiredTiger-bergingsenjins gebruik aanteken om dit te voorkom, alhoewel WiredTiger tot die laaste konsekwente kan herstel beheerpunt, as aanteken gedeaktiveer is.

Joernering verseker dat die databasis in 'n konsekwente toestand is na herstel en behou alle data totdat dit na die logboek geskryf word. Die frekwensie van opnames word gekonfigureer met behulp van die parameter commitIntervalMs.

Om seker te wees van die inskrywings, maak seker dat aantekening in die konfigurasielêer geaktiveer is (storage.journal.enabled), en die frekwensie van opnames stem ooreen met die hoeveelheid inligting wat jy kan bekostig om te verloor.

Sorteer sonder indeks

Wanneer daar gesoek en saamgevoeg word, is daar dikwels 'n behoefte om data te sorteer. Kom ons hoop dat dit in een van die finale stadiums gedoen word, nadat die resultaat gefiltreer is om die hoeveelheid data wat gesorteer word te verminder. En selfs in hierdie geval, sal jy nodig hê om te sorteer indeks. Jy kan 'n enkele of saamgestelde indeks gebruik.

As daar nie 'n geskikte indeks is nie, sal MongoDB daarsonder klaarkom. Daar is 'n geheuelimiet van 32 MB op die totale grootte van alle dokumente in sorteer operasies, en as MongoDB hierdie limiet bereik, sal dit óf 'n fout gooi óf terugkeer leë rekordstel.

Soek sonder indeksondersteuning

Soeknavrae voer 'n funksie soortgelyk aan die JOIN-bewerking in SQL uit. Om die beste te werk, benodig hulle die indeks van die waarde van die sleutel wat as die vreemde sleutel gebruik word. Dit is nie voor die hand liggend nie, want die gebruik word nie weerspieël in nie explain(). Sulke indekse is bykomend tot die indeks wat ingeskryf is explain(), wat op sy beurt deur pyplynoperateurs gebruik word $match и $sort, wanneer hulle aan die begin van die pyplyn ontmoet. Indekse kan nou enige stadium dek aggregasie pyplyn.

Onttrekking van die gebruik van multi-opdaterings

metode db.collection.update() gebruik om 'n deel van 'n bestaande dokument of die hele dokument te verander, tot 'n volledige vervanging, afhangende van die parameter wat jy spesifiseer update. Wat nie so voor die hand liggend is nie, is dat dit nie alle dokumente in die versameling sal verwerk nie, tensy jy die opsie stel multi om alle dokumente op te dateer wat aan die versoekkriteria voldoen.

Moenie die belangrikheid van die volgorde van die sleutels in 'n hash-tabel vergeet nie

In JSON bestaan ​​'n voorwerp uit 'n ongeordende versameling van grootte nul of meer naam/waarde-pare, waar naam 'n string is en waarde 'n string, getal, boolean, nul, voorwerp of skikking is.

Ongelukkig plaas BSON baie klem op orde wanneer jy soek. In MongoDB, die volgorde van sleutels binne ingeboude voorwerpe sakeDws { firstname: "Phil", surname: "factor" } - dit is nie dieselfde as { { surname: "factor", firstname: "Phil" }. Dit wil sê, jy moet die volgorde van naam/waarde-pare in jou dokumente stoor as jy seker wil wees om dit te vind.

Moenie verward wees nie "Nul" и "ongedefinieerd"

Waarde "ongedefinieerd" was nooit geldig in JSON, volgens amptelike standaard JSON (ECMA-404 Afdeling 5), al word dit in JavaScript gebruik. Boonop is dit vir BSON verouderd en word dit omgeskakel na $null, wat nie altyd 'n goeie oplossing is nie. Vermy die gebruik "ongedefinieerd" in MongoDB.

Gebruik $limit() sonder $sort()

Dikwels wanneer jy in MongoDB ontwikkel, is dit nuttig om net 'n voorbeeld van die resultaat te sien wat van 'n navraag of samevoeging teruggestuur sal word. Vir hierdie taak sal jy nodig hê $limit(), maar dit moet nooit in die finale kode wees nie, tensy jy dit voorheen gebruik het $sort. Hierdie werktuigkundige is nodig, want anders kan jy nie die volgorde van die resultaat waarborg nie, en jy sal nie die data betroubaar kan sien nie. Aan die bokant van die resultaat sal jy verskillende inskrywings kry, afhangende van die sortering. Om betroubaar te werk, moet navrae en samevoegings deterministies wees, dit wil sê, dieselfde resultate lewer elke keer as hulle uitgevoer word. Kode wat bevat $limit(), maar nee $sort, sal nie deterministies wees nie en kan daarna foute veroorsaak wat moeilik sal wees om op te spoor.

Gevolgtrekking

Die enigste manier om teleurgesteld te wees met MongoDB is om dit direk te vergelyk met 'n ander tipe databasis, soos 'n DBMS, of om tot die gebruik daarvan te kom op grond van sekere verwagtinge. Dit is soos om 'n lemoen met 'n vurk te vergelyk. Databasisstelsels dien spesifieke doeleindes. Dit is die beste om eenvoudig hierdie verskille self te verstaan ​​en te waardeer. Dit sal 'n skande wees om die MongoDB-ontwikkelaars te druk oor 'n pad wat hulle op die DBMS-pad gedwing het. Ek wil nuwe en interessante maniere sien om ou probleme op te los, soos om data-integriteit te verseker en datastelsels te skep wat bestand is teen mislukking en kwaadwillige aanvalle.

MongoDB se bekendstelling van ACID-transaksionaliteit in weergawe 4.0 is 'n goeie voorbeeld van die bekendstelling van belangrike verbeterings op 'n innoverende manier. Multi-dokument en multi-stelling transaksies is nou atoom. Dit is ook moontlik om die tyd wat nodig is om slotte te bekom en vasgekeerde transaksies te beëindig aan te pas, asook om die isolasievlak te verander.

14 dinge wat ek wens ek geweet het voordat ek met MongoDB begin het

Lees meer:

Bron: will.com

Voeg 'n opmerking