Straipsnio vertimas buvo parengtas kursų pradžios išvakarėse
Renginiai:
- Labai svarbu sukurti schemą, net jei MongoDB ji yra neprivaloma.
- Taip pat indeksai turi atitikti jūsų schemą ir prieigos šablonus.
- Nenaudokite didelių objektų ir didelių masyvų.
- Būkite atsargūs su MongoDB nustatymais, ypač kai kalbama apie saugumą ir patikimumą.
- MongoDB neturi užklausų optimizavimo priemonės, todėl atlikdami užklausos operacijas turite būti atsargūs.
Su duomenų bazėmis dirbu labai ilgai, bet tik neseniai atradau MongoDB. Yra keletas dalykų, kuriuos norėčiau žinoti prieš pradėdamas dirbti. Kai žmogus jau turi patirties tam tikroje srityje, jis turi išankstinį nusistatymą apie tai, kas yra duomenų bazės ir ką jos veikia. Tikėdamasis, kad kitiems būtų lengviau suprasti, pateikiu dažniausiai daromų klaidų sąrašą.
MongoDB serverio kūrimas be autentifikavimo
Deja, pagal numatytuosius nustatymus MongoDB yra įdiegtas be autentifikavimo. Jei darbo stotis pasiekiama vietoje, ši praktika yra įprasta. Tačiau kadangi MongoDB yra kelių vartotojų sistema, kuri mėgsta naudoti didelius atminties kiekius, bus geriau, jei įdėsite ją į serverį su kuo daugiau RAM, net jei ketinate ją naudoti tik plėtrai. Diegimas serveryje per numatytąjį prievadą gali būti problemiškas, ypač jei užklausoje gali būti vykdomas bet koks javascript kodas (pvz., $where
kaip idėja
Yra keli autentifikavimo būdai, tačiau lengviausia nustatyti vartotojo ID/slaptažodį. Naudokite šią idėją, kai galvojate apie išgalvotą autentifikavimą, pagrįstą
Nepamirškite susieti atakos paviršiaus su MongoDB
,
arba
. Kadangi duomenų failai nėra užšifruoti standartiniame MongoDB, prasminga paleisti MongoDB su
Klaida kuriant grandinę
MongoDB nenaudoja schemos. Bet tai nereiškia, kad schema nereikalinga. Jei norite tiesiog saugoti dokumentus be jokio nuoseklaus šablono, juos saugoti gali būti greita ir paprasta, tačiau vėliau juos atkurti gali būti sunku.
Klasikinis straipsnis "
Nepamirškite rūšiavimo tvarkos
Rūšiavimo tvarkos pamiršimas gali sukelti daugiau nusivylimo ir sugaišti daugiau laiko nei bet kuri kita neteisinga konfigūracija. Pagal numatytuosius nustatymus MongoBD naudoja
Kurkite kolekcijas su dideliais dokumentais
MongoDB mielai talpina didelius dokumentus iki 16 MB kolekcijose ir
Kurti dokumentus su dideliais masyvais
Dokumentuose gali būti masyvų. Geriausia, jei elementų skaičius masyve yra toli gražu ne keturženklis skaičius. Jei elementai į masyvą pridedami dažnai, jis išaugs už dokumentą, kuriame jis yra, ir turės būti
MongoDB turi kažką vadinamo
Galbūt manote, kad galite apsieiti be masyvo indeksavimo. Deja, indeksų trūkumas gali sukelti kitų problemų. Kadangi dokumentai nuskaitomi nuo pradžios iki pabaigos, elementų paieška masyvo pabaigoje užtruks ilgiau, o dauguma su tokiu dokumentu susijusių operacijų bus
Nepamirškite, kad svarbi agregacijos etapų tvarka
Duomenų bazės sistemoje su užklausų optimizavimo priemone jūsų parašytos užklausos yra paaiškinimai, ką norite gauti, o ne kaip tai gauti. Šis mechanizmas veikia pagal analogiją su užsakymu restorane: dažniausiai tiesiog užsisakote patiekalą, o virėjui neduodate išsamių nurodymų.
MongoDB jūs nurodote virėją. Pavyzdžiui, turite įsitikinti, kad duomenys perduodami reduce
kuo anksčiau, naudojant dujotiekį $match
и $project
, o rūšiavimas vyksta tik po to reduce
, ir kad paieška būtų atliekama tiksliai tokia tvarka, kokia norite. Jei turite užklausų optimizavimo priemonę, kuri pašalina nereikalingą darbą, optimaliai suskirsto veiksmus ir pasirenka sujungimo tipus, galite jus sugadinti. Naudodami „MongoDB“ galite daugiau valdyti patogumo kaina.
Įrankiai kaip
Greito įrašymo naudojimas
Niekada nenustatykite MongoDB rašymo parinkčių, kad jos būtų didelės spartos, bet mažo patikimumo. Šis režimas „failas ir pamiršk“ atrodo greita, nes komanda grąžinama prieš rašant. Jei sistema sugenda prieš įrašant duomenis į diską, jie bus prarasti ir atsiras nenuoseklios būsenos. Laimei, 64 bitų MongoDB įjungtas registravimas.
MMAPv1 ir WiredTiger saugojimo varikliai naudoja registravimą, kad to išvengtų, nors WiredTiger gali atsigauti iki paskutinės nuoseklios
Žurnalų kūrimas užtikrina, kad po atkūrimo duomenų bazė būtų nuoseklios būsenos, ir išsaugo visus duomenis, kol jie bus įrašyti į žurnalą. Įrašymų dažnis sukonfigūruojamas naudojant parametrą
.
Kad būtumėte tikri dėl įrašų, įsitikinkite, kad konfigūracijos faile įjungtas registravimas
, o įrašų dažnis atitinka informacijos kiekį, kurį galite sau leisti prarasti.
Rūšiavimas be indekso
Ieškant ir kaupiant duomenis dažnai reikia rūšiuoti. Tikėkimės, kad tai bus padaryta viename iš paskutinių etapų, išfiltravus rezultatą, siekiant sumažinti rūšiuojamų duomenų kiekį. Ir net šiuo atveju rūšiavimui jums reikės
Jei nėra tinkamo indekso, MongoDB apsieis be jo. Bendram visų dokumentų dydžiui yra 32 MB atminties limitas
Ieškokite be rodyklės palaikymo
Paieškos užklausos atlieka funkciją, panašią į JOIN operaciją SQL. Kad veiktų geriausiai, jiems reikalingas rakto, naudojamo kaip išorinis raktas, vertės indeksas. Tai nėra akivaizdu, nes naudojimas neatsispindi explain()
. Tokie indeksai pridedami prie įrašyto indekso explain()
, kurį savo ruožtu naudoja vamzdynų operatoriai $match
и $sort
, kai jie susitinka dujotiekio pradžioje. Dabar indeksai gali apimti bet kurį etapą
Atsisakymas naudoti kelis naujinius
metodas
naudojamas esamo dokumento daliai arba visam dokumentui pakeisti iki visiško pakeitimo, atsižvelgiant į jūsų nurodytą parametrą
. Ne taip akivaizdu, kad jis neapdoros visų kolekcijoje esančių dokumentų, nebent nustatysite parinktį
atnaujinti visus prašymo kriterijus atitinkančius dokumentus.
Nepamirškite raktų tvarkos maišos lentelėje svarbos
JSON objektą sudaro netvarkinga nulinio dydžio ar daugiau vardo/reikšmių porų rinkinio, kur pavadinimas yra eilutė, o reikšmė yra eilutė, skaičius, loginis, nulis, objektas arba masyvas.
Deja, BSON ieškodamas daug dėmesio skiria tvarkai. MongoDB raktų tvarka integruotuose objektuose { firstname: "Phil", surname: "factor" }
- tai ne tas pats kaip { { surname: "factor", firstname: "Phil" }
. Tai yra, jei norite būti tikri, kad juos rasite, savo dokumentuose turite išsaugoti pavadinimo/reikšmių porų tvarką.
Nesusipainiokite "Nulis" и "neapibrėžtas"
Vertė "neapibrėžtas" pagal JSON niekada negaliojo $null
, kuris ne visada yra geras sprendimas.
Naudoti $limit()
be $sort()
Gana dažnai, kai kuriate MongoDB, naudinga tiesiog pamatyti rezultato pavyzdį, kuris bus grąžintas iš užklausos ar agregacijos. Šiai užduočiai atlikti jums reikės $limit()
, bet jis niekada neturėtų būti galutiniame kode, nebent jį naudojote anksčiau $sort
. Šis mechanikas reikalingas, nes kitu atveju negalite garantuoti rezultato eiliškumo ir negalėsite patikimai peržiūrėti duomenų. Rezultato viršuje gausite skirtingus įrašus, priklausomai nuo rūšiavimo. Kad užklausos ir agregacijos veiktų patikimai, jos turi būti deterministinės, ty kiekvieną kartą vykdant duoti tuos pačius rezultatus. Kodas, kuriame yra $limit()
, bet ne $sort
, nebus deterministinis ir vėliau gali sukelti klaidų, kurias bus sunku atsekti.
išvada
Vienintelis būdas nusivilti MongoDB yra palyginti ją tiesiogiai su kito tipo duomenų baze, pvz., DBVS, arba pradėti ją naudoti remiantis tam tikrais lūkesčiais. Tai tarsi apelsino palyginimas su šakute. Duomenų bazių sistemos tarnauja specifiniams tikslams. Geriausia šiuos skirtumus suprasti ir įvertinti patiems. Būtų gaila daryti spaudimą MongoDB kūrėjams dėl kelio, kuris privertė juos eiti DBVS keliu. Noriu pamatyti naujų ir įdomių būdų, kaip išspręsti senas problemas, pavyzdžiui, užtikrinti duomenų vientisumą ir sukurti duomenų sistemas, kurios būtų atsparios gedimams ir kenkėjiškoms atakoms.
„MongoDB“ 4.0 versijoje įdiegė ACID sandorius yra geras pavyzdys, kaip naujoviškai įvedami svarbūs patobulinimai. Kelių dokumentų ir kelių pareiškimų operacijos dabar yra labai didelės. Taip pat galima reguliuoti laiką, reikalingą spynoms įsigyti ir užstrigusioms operacijoms nutraukti, taip pat pakeisti izoliacijos lygį.
Skaityti daugiau:
Šaltinis: www.habr.com