14 asja, mida ma tahaksin teada MongoDB-ga töötamise alustamiseks

Artikli tĂ”lge on koostatud kursuse alguse eelĂ”htul „Mittelemata andmebaasid“.

14 asja, mida ma tahaksin teada MongoDB-ga töötamise alustamiseks

Peamised punktid:

  • On ÀÀrmiselt oluline vĂ€lja töötada skeem, kuigi MongoDBs see ei ole kohustuslik.
  • Sarnaselt peavad indeksid vastama teie skeemile ja juurdepÀÀsude mallidele.
  • VĂ€ltige suurte objektide ja massiivide kasutamist.
  • Olge MongoDB seadistustega ettevaatlik, eriti kui tegemist on turvalisuse ja usaldusvÀÀrsusega.
  • MongoDBs ei ole pĂ€ringute optimeerijat, seega peate olema ettevaatlik pĂ€ringute tegemisel.

Olen juba pikka aega andmebaasidega töötanud, kuid avastasin MongoDB alles hiljuti. On mÔned asjad, mida sooviksin teada enne selle kasutamise alustamist. Kui inimesel on teatud valdkonnas juba kogemus, siis on tal eelarvamused selle suhtes, mida andmebaasid on ja mida nad teevad. Loodan, et teiste jaoks arusaamise lihtsustamiseks esitan loetelu levinud vigadest.

MongoDB serveri loomine ilma autentimiseta

Kahjuks installitakse MongoDB vaikimisi ilma autentimiseta. Kohalikult juurdepÀÀsuga tööjaama jaoks on see tava normaalne. Kuid kuna MongoDB on mitme kasutajaga sĂŒsteem, mis armastab kasutada suurt mĂ€lu, on parem paigaldada see serverisse, kus on teie tingimustes maksimaalselt vĂ”imalik mĂ€lumaht, isegi kui kavatsete seda kasutada ainult arendamiseks. Serverisse paigaldamine vaikimisi pordi kaudu vĂ”ib olla probleemne, eriti kui pĂ€ringutes on vĂ”imalik tĂ€ita mis tahes JavaScripti kood (nĂ€iteks $where ideena sĂŒstimise).

On mitu autentimismeetodit, kuid lihtsaim on seadistada kasutaja ID/parool. Kasutage seda ideed, kuni mÔtledate keerulisema autentimise peale, mis pÔhineb LDAP. Kui rÀÀkida turvalisusest, siis MongoDB tuleks pidevalt uuendada ja logisid tuleks alati kontrollida volitamata juurdepÀÀsu osas. NÀiteks meeldib mulle valida mÔni muu port kui vaikimisi port.

Ärge unustage siduda rĂŒnnakupinda MongoDBga

MongoDB turvalisuse kontrollnimekiri sisaldab hĂ€id nĂ€punĂ€iteid vĂ”rgu ja andmelekke riski vĂ€hendamiseks. On lihtne öelda, et arendussuvand ei vaja kĂ”rget turvalisuse taset. Kuid asjad ei ole nii lihtsad ja see kehtib kĂ”igi MongoDB serverite kohta. Eriti kui puudub kaalukas pĂ”hjus kasutada mapReduce, gruppe vĂ”i $where, tuleks keelata JavaScripti kohandatud koodi kasutamine, kirjutades konfiguratsioonifaili javascriptEnabled:false. Kuna vaikimisi MongoDB andmefailid ei ole krĂŒpteeritud, on mĂ”istlik kĂ€ivitada MongoDB koos pĂŒhendatud kasutajaga, kellel on tĂ€ielik juurdepÀÀs failidele, mille juurdepÀÀs on piiratud ainult talle ja vĂ”imalusega kasutada oma opsĂŒsteemi failide juurdepÀÀsuvahendeid.

Schema loomise vigade

MongoDB ei kasuta skeemi. Kuid see ei tĂ€henda, et skeem ei oleks vajalik. Kui soovite lihtsalt dokumente salvestada ilma ĂŒhtse skeemita, on nende salvestamine kiire ja lihtne, kuid hiljem vĂ€lja toomine vĂ”ib olla kuradima keeruline.

Klassikaline artikkel „6 empiirilist reeglit MongoDB skeemi kujundamiseks on seda vÀÀrt, et seda lugeda, ning selliseid funktsioone nagu Schema Explorer kolmandate osapoolte tööriistas Studio 3T tuleks kasutada regulaarseteks skeemi kontrollideks.

Ärge unustage sorteerimisjĂ€rjekorda

SorteerimisjĂ€rjekorra unustamine vĂ”ib kĂ”ige rohkem pettumust valmistada ja aega kaotada rohkem kui ĂŒkski vale konfigureerimine. Vaikimisi kasutab MongoDB binaarset sorteerimist. Kuid sellest pole kellelegi kasu. Suurte ja vĂ€ikeste tĂ€htede ning binaarsete sorteerimiste kasutamine on olnud kummalised anahronismid koos helmeste, kaftanide ja keerlevate vuntsidega juba 80ndatel. NĂŒĂŒd on nende kasutamine andestamatu. Reaalses elus on "mootorratas" sama mis "Mootorratas". Ja "Britannia" ja "britannia" on sama koht. VĂ€ike tĂ€ht on lihtsalt suure tĂ€he vastavuskiri. Ja Ă€rge sundige mind rÀÀkima diakriitiliste mĂ€rkide sorteerimisest. MongoDB andmebaasi loomisel kasutage sorteerimisparameetreid, mis arvestavad aktsentide ja registreid, mis vastavad sĂŒsteemi kasutajate keelele ja kultuurile. See lihtsustab stringiandmete otsimist oluliselt.

Suure dokumentide loomine kogud

MongoDB on rÔÔmuga paigutada suuri dokumente, mille suurus on kuni 16 MB kollektsioonidesse, kuid GridFS on mĂ”eldud dokumentide jaoks, mille suurus ĂŒletab 16 MB. Kuid ainult seetĂ”ttu, et suuri dokumente saab sinna paigutada, ei ole nende seal hoidmine parim idee. MongoDB töötab kĂ”ige paremini, kui salvestate eraldi dokumente, mille suurus on paar kilobaiti, vaadates neid pigem kui ridu laias SQL-i tabelis. Suured dokumendid vĂ”ivad pĂ”hjustada probleeme sooritusvĂ”imega.

Dokumentide loomine, millel on suured massiivid

Dokumendid vĂ”ivad sisaldada massiive. Parim oleks, kui massiivi elementide arv jÀÀb kaugele kaugemale neljast numbrist. Kui elemente massiivile sageli lisatakse, kasvab see dokumenti sisaldavast massiivist ĂŒle ja tuleb liigutada, mis tĂ€hendab, et tuleb uuendada ka indeksid. Kui dokumendi sisu on suur massiiv, siis indeksid tihti uuendatakse, sest iga elemendi jaoks on olemas kanne, mis hoiab selle indeksit. Selline uuesti indekseerimine toimub ka siis, kui dokumente lisatakse vĂ”i kustutatakse.

MongoDB-s on niiöelda «tÀituvuskoefitsient», mis annab dokumentide kasvamiseks ruumi, et vÀhendada seda probleemi miinimumini.
VÔite arvata, et massiivide indekseerimisest vÔib loobuda. Kahjuks vÔivad indeksite puudumise tÔttu tekkida teised probleemid. Kuna dokumente vaadatakse algusest lÔpuni, vÔtab massiivi lÔpus elementide otsimine rohkem aega, ja enamus seonduvaid toimingud sellise dokumendiga on aeglased.

Ärge unustage, et agregatsiooni etappide jĂ€rjekord on oluline

KĂŒsimusandmebaasis, millel on pĂ€ringute optimeerija, on teie kirjutatud pĂ€ringud seletused selle kohta, mida te soovite saada, mitte selle kohta, kuidas seda saada. See toimib sarnaselt restorani tellimisega: tavaliselt tellite lihtsalt roa, mitte ei anna kokale ĂŒksikasjalikke juhiseid.

MongoDB-s annate te kokkadele korraldusi. NĂ€iteks peate veenduma, et andmed lĂ€bivad reduce nii vara kui vĂ”imalik toru kaudu, kasutades $match ja $project, ja sortimine toimub alles hiljem. reduce, ja otsimine toimub tĂ€pselt sellises jĂ€rjestuses, nagu teil on vaja. KĂŒsitavate optimeerija olemasolu, mis vabastab teid liigsetest töödest, korraldab etapid optimaalselt ja valib ĂŒhenduse tĂŒĂŒbi, vĂ”ib teid Ă€ra hellitada. MongoDB-s on teil rohkem kontrolli mugavuse hinna ĂŒle.

Sellised tööriistad nagu Studio 3T muudavad aggregeerimispĂ€ringute koostamise lihtsamaks MongoDB. Aggregation Editori funktsioon vĂ”imaldab teil rakendada toruoperaatoreid ĂŒksikute etappide kaupa, samuti kontrollida igas etapis sisendi ja vĂ€ljundi andmeid, et debugeerimine oleks lihtsam.

Kiire kirje kasutamine

Ärge seadistage MongoDB-s kĂ”rge kiiruseta kirje parameetreid, kuid madala usaldusvÀÀrsusega. See reĆŸiim «file-and-forget» tundub kiire, kuna kĂ€sk tagastatakse enne, kui kirje tehakse. Kui sĂŒsteem kokku kukub enne, kui andmed on kettale kirjutatud, kaovad need ja satuvad mittetĂ€ielikku olekusse. Õnneks on 64-bitises MongoDB-s logimine sisse lĂŒlitatud.

Salvestuse MMAPv1 ja WiredTiger mootorid kasutavad logimist, et seda vĂ€ltida, kuigi WiredTiger vĂ”ib taastuda viimase kooskĂ”lastatud kontrollpunkti, kui logimine on vĂ€lja lĂŒlitatud.

Logimine tagab, et andmebaas on taastumisel kooskÔlastatud ja hoiab kÔiki andmeid kuni logisse kirjutamiseni. Kirje sagedus seadistatakse parameetri kaudu commitIntervalMs.

Veenduge, et logimine oleks konfiguratsioonifailis lubatud (storage.journal.kasutatud), ja et kirje sagedus vastab sellele, kui palju teavet te vÔite endale lubada kaotada.

Sortimine ilma indeksita

Andmete otsimise ja aggregeerimise kĂ€igus tekib sageli vajadus andmete sortimise jĂ€rele. Lootkem, et seda tehakse ĂŒhe viimase etapi kĂ€igus, pĂ€rast tulemuste filtreerimist, et vĂ€hendada sorteeritavate andmete hulka. Ja isegi sel juhul vajate sortimiseks indeksit. Saate kasutada ĂŒksik- vĂ”i koostisindeksit.

Kui sobivat indeksit ei ole, saab MongoDB hakkama ka ilma selleta. Sortimise operatsiooni kogumahu jaoks on olemas 32 MB mĂ€lu piirang , ja kui MongoDB saavutab selle piiri, siis kas ta kuvab vigade arvu vĂ”i tagastabtĂŒhja kirje kogumi Otsimine ilma indeksite toetamiseta.

Otsing ilma indeksitoega

OtsingupĂ€ringud tĂ€idavad sarnast funktsiooni nagu JOIN-operatsioon SQL-is. Parema toimimise jaoks vajavad nad indeksit vĂ€listava vĂ”tme vÀÀrtuse pĂ”hjal, mida kasutatakse vĂ€lisvĂ”tmena. See ei ole ilmselge, kuna kasutamine ei peegeldu explain(). Sellised indeksid on tĂ€ienduseks indeksile, mis on salvestatud explain(), mida omakorda kasutavad toruoperaatorid $match ja $sort, kui need esinevad toru alguses. Indeksid vĂ”ivad nĂŒĂŒd katta mistahes etappi aggregeerimistorustikus.

Mitme uuenduse kasutamisest loobumine

Meetod db.kogu.uuendus() kasutatakse olemasoleva dokumendi osa vÔi kogu dokumendi muutmiseks, sÔltuvalt teie mÀÀratud parameetrist, kuni tÀieliku asendamiseni update. Ei ole nii ilmne, et see ei töötle kÔiki dokumente kollektsioonis, kui te ei mÀÀra parameetrit mitme kÔikide dokumentide uuendamiseks, mis vastavad pÀringu kriteeriumitele.

Ärge unustage vĂ”tmete jĂ€rjekorra tĂ€htsust hajusates tabelites.

JSON-is koosneb objekt mittejÀrgnevast kollektsioonist, mille suurus on null vÔi enam nimede/vÀÀrtuste paari, kus nimi on string ja vÀÀrtus on string, number, loogiline vÀÀrtus, null, objekt vÔi massiiv.

Kahjuks omab BSON otsimise ajal jÀrjekorra osas suurt tÀhtsust. MongoDB-s peab sisseehitatud objektide vÔtmete jÀrjekord oma vÀÀrtuseks, st { firstname: "Phil", surname: "factor" } ei ole sama mis { { surname: "factor", firstname: "Phil" }. See tÀhendab, et peate dokumentides hoidma nimede/ vÀÀrtuste paaride jÀrjekorra, kui soovite olla kindel, et leiate need.

Ärge segage kokku "null" ja "undefined"

TĂ€hendus "undefined" ei ole kunagi olnud lubatud JSON-is, vastavalt ametlikule standardile JSON (ECMA-404, jaotis 5), hoolimata sellest, et seda kasutatakse JavaScriptis. Veelgi enam, BSON jaoks on see aegunud ja muundatakse $null, mis ei ole alati hea lahendus. VĂ€ltige kasutamist "undefined" MongoDB-s.

Kasutamine $limit() ilma $sort()

VĂ€ga tihti, kui arendate MongoDB-s, on kasulik lihtsalt nĂ€ha tulemuse nĂ€idist, mis pĂ€ringust vĂ”i aggregeerimisest tagasi tuleb. Selle ĂŒlesande jaoks on teil kasu $limit(), kuid seda ei tohi kunagi olla lĂ”ppversioonis koodis, kui te ei kasuta seda enne $sort. See mekanism on vajalik, kuna muidu ei saa te garanteerida tulemuste jĂ€rjekorda ja ei saa usaldusvÀÀrselt andmeid vaadata. Tulemuste ĂŒlaservas saate erinevaid kirjeid sĂ”ltuvalt sorteerimisest. UsaldusvÀÀrseks toimimiseks peavad pĂ€ringud ja aggregeerimised olema deterministlikud, st andma iga tĂ€itmise korral samu tulemusi. Kood, milles on $limit(), kuid ei ole $sort, ei ole deterministlik ja vĂ”ib hiljem pĂ”hjustada vigu, mida on raske jĂ€lgida.

KokkuvÔte

Ainus viis, kuidas MongoDBs ĂŒldse pettuda, on vĂ”rrelda seda otseselt teist tĂŒĂŒpi andmebaaside, nĂ€iteks SÜB, vĂ”i kasutada seda teatud ootuste pĂ”hjal. See on sama, mis vĂ”rrelda apelsini kahvliga. AndmebaasisĂŒsteemid jĂ€lgivad teatud eesmĂ€rke. Parim on lihtsalt mĂ”ista ja hinnata neid erinevusi. Oleks hĂ€bi suruda MongoDB arendajaid nende valikute pĂ€rast, mis on sundinud neid liikuma SÜB teed. Ma soovin nĂ€ha uusi ja huvitavaid viise vanade probleemide, nĂ€iteks andmete terviklikkuse tagamise ja vigadele ning hĂ€kkerite rĂŒnnakutele vastupidavate andmesĂŒsteemide loomise lahendamiseks.

MongoDB 4.0 versioonis ACID tehingute rakendamine on hea nĂ€ide oluliste parenduste uuenduslikust rakendamisest. Multi-dokumendilised ja multi-tegevuslikud tehingud on nĂŒĂŒd atomaarset laadi. Samuti on saadaval vĂ”imalus reguleerida aega, mis on vajalik lukustuste saamiseks, ja lĂ”petada kinni jÀÀnud tehingud ning muuta isoleerimise taset.

14 asja, mida ma tahaksin teada MongoDB-ga töötamise alustamiseks

Loe edasi:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster