Prevod članka je bil pripravljen na predvečer začetka tečaja
Poudarki:
- Zelo pomembno je razviti shemo, čeprav je v MongoDB neobvezna.
- Podobno se morajo indeksi ujemati z vašo shemo in vzorci dostopa.
- Izogibajte se uporabi velikih predmetov in velikih nizov.
- Bodite previdni pri nastavitvah MongoDB, zlasti ko gre za varnost in zanesljivost.
- MongoDB nima optimizatorja poizvedb, zato morate biti pri izvajanju poizvedovalnih operacij previdni.
Z bazami podatkov delam že zelo dolgo, vendar sem šele pred kratkim odkril MongoDB. Nekaj stvari bi si želel vedeti, preden bi začel delati s tem. Ko ima oseba že izkušnje na določenem področju, ima vnaprej oblikovane predstave o tem, kaj so baze podatkov in kaj počnejo. V upanju, da ga bodo drugi lažje razumeli, predstavljam seznam pogostih napak.
Ustvarjanje strežnika MongoDB brez preverjanja pristnosti
Na žalost je MongoDB privzeto nameščen brez preverjanja pristnosti. Za delovno postajo, do katere dostopate lokalno, je ta praksa normalna. Ker pa je MongoDB večuporabniški sistem, ki rad uporablja velike količine pomnilnika, bo bolje, če ga postavite na strežnik s čim več RAM-a, tudi če ga boste uporabljali le za razvoj. Namestitev na strežnik prek privzetih vrat je lahko problematična, še posebej, če je v zahtevi mogoče izvesti katero koli kodo javascript (npr. $where
kot ideja za
Obstaja več načinov preverjanja pristnosti, vendar je najlažji nastavitev uporabniškega ID-ja/gesla. Uporabite to idejo, medtem ko razmišljate o modni avtentikaciji, ki temelji na
Ne pozabite povezati napadalne površine z MongoDB
,
ali
. Ker podatkovne datoteke niso šifrirane v standardnem MongoDB, je smiselno zagnati MongoDB z
Napaka med razvijanjem vezja
MongoDB ne uporablja sheme. Vendar to ne pomeni, da shema ni potrebna. Če želite samo shraniti dokumente brez kakršnega koli doslednega vzorca, je njihovo shranjevanje lahko hitro in enostavno, vendar pa je njihovo poznejše pridobivanje lahko težavno.
Klasičen članek "
Ne pozabite na vrstni red
Če pozabite na vrstni red razvrščanja, lahko povzročite več frustracij in izgubite več časa kot katera koli druga nepravilna konfiguracija. MongoBD privzeto uporablja
Ustvarite zbirke z velikimi dokumenti
MongoDB z veseljem gosti velike dokumente do 16 MB v zbirkah in
Ustvarjanje dokumentov z velikimi nizi
Dokumenti lahko vsebujejo polja. Najbolje je, če je število elementov v nizu daleč od štirimestnega števila. Če se elementi pogosto dodajajo v matriko, bo prerasla dokument, ki jo vsebuje, in bo morala biti
MongoDB ima nekaj, kar se imenuje
Morda mislite, da lahko storite brez indeksiranja matrike. Na žalost lahko pomanjkanje indeksov povzroči druge težave. Ker se dokumenti skenirajo od začetka do konca, bo iskanje elementov na koncu polja trajalo dlje, večina operacij, povezanih s takim dokumentom, pa bo
Ne pozabite, da je vrstni red stopenj v združevanju pomemben
V sistemu baze podatkov z optimizatorjem poizvedb so poizvedbe, ki jih napišete, razlage, kaj želite dobiti, in ne, kako to pridobiti. Ta mehanizem deluje po analogiji z naročanjem v restavraciji: običajno preprosto naročite jed in kuharju ne daste podrobnih navodil.
V MongoDB dajete navodila kuharju. Na primer, zagotoviti morate, da podatki prehajajo reduce
čim prej v pripravi $match
и $project
, razvrščanje pa se izvede šele po reduce
in da se iskanje izvaja v točno tistem vrstnem redu, kot ga potrebujete. Če imate optimizator poizvedb, ki odpravi nepotrebno delo, optimalno zaporedje korakov in izbiro vrst povezav, vas lahko razvaja. Z MongoDB imate več nadzora za ceno priročnosti.
Orodja kot
Uporaba hitrega snemanja
Možnosti pisanja MongoDB nikoli ne nastavite tako, da imajo visoko hitrost, a nizko zanesljivost. Ta način "vnesi in pozabi" se zdi hitro, ker je ukaz vrnjen, preden pride do pisanja. Če se sistem zruši, preden se podatki zapišejo na disk, se izgubijo in končajo v nedoslednem stanju. Na srečo ima 64-bitni MongoDB omogočeno beleženje.
Mehanizem za shranjevanje MMAPv1 in WiredTiger uporabljata beleženje, da to preprečita, čeprav lahko WiredTiger obnovi do zadnje skladne
Dnevnik zagotavlja, da je baza podatkov po obnovitvi v konsistentnem stanju in hrani vse podatke, dokler niso zapisani v dnevnik. Pogostost snemanja se konfigurira s parametrom
.
Če želite biti prepričani o vnosih, se prepričajte, da je v konfiguracijski datoteki omogočeno beleženje
, pogostost posnetkov pa ustreza količini informacij, ki si jih lahko privoščite izgubiti.
Razvrščanje brez indeksa
Pri iskanju in združevanju je pogosto treba razvrstiti podatke. Upajmo, da bo to storjeno na eni od zadnjih stopenj, po filtriranju rezultatov, da se zmanjša količina podatkov, ki jih je treba razvrstiti. In tudi v tem primeru boste potrebovali za razvrščanje
Če ni ustreznega indeksa, bo MongoDB opravil brez njega. Skupna velikost vseh dokumentov v pomnilniku je omejena na 32 MB
Iskanje brez podpore za indeks
Iskalne poizvedbe izvajajo podobno funkcijo kot operacija JOIN v SQL. Za najboljše delovanje potrebujejo indeks vrednosti ključa, uporabljenega kot tuji ključ. To ni očitno, ker se uporaba ne odraža v explain()
. Takšni indeksi so poleg indeksa, zapisanega v explain()
, ki ga uporabljajo operaterji cevovodov $match
и $sort
, ko se srečata na začetku plinovoda. Indeksi lahko zdaj pokrivajo katero koli stopnjo
Izključitev uporabe večkratnih posodobitev
Metoda
uporablja se za spremembo dela obstoječega dokumenta ali celotnega dokumenta, do popolne zamenjave, odvisno od parametra, ki ga določite
. Kar ni tako očitno, je, da ne bo obdelal vseh dokumentov v zbirki, razen če nastavite možnost
za posodobitev vseh dokumentov, ki ustrezajo kriterijem zahteve.
Ne pozabite na pomen vrstnega reda ključev v zgoščevalni tabeli
V JSON je objekt sestavljen iz neurejene zbirke velikosti nič ali več parov ime/vrednost, kjer je ime niz, vrednost pa niz, število, logična vrednost, nič, predmet ali matrika.
BSON na žalost daje velik poudarek vrstnemu redu pri iskanju. V MongoDB vrstni red ključev znotraj vgrajenih objektov { firstname: "Phil", surname: "factor" }
- to ni isto kot { { surname: "factor", firstname: "Phil" }
. To pomeni, da morate shraniti vrstni red parov ime/vrednost v svojih dokumentih, če želite biti prepričani, da jih boste našli.
Naj vas ne zmede "Nič" и "nedoločeno"
Vrednost "nedoločeno" glede na to ni bil nikoli veljaven v JSON $null
, kar ni vedno dobra rešitev.
Uporaba $limit()
brez $sort()
Precej pogosto, ko razvijate v MongoDB, je koristno videti samo vzorec rezultata, ki bo vrnjen iz poizvedbe ali združevanja. Za to nalogo boste potrebovali $limit()
, vendar nikoli ne sme biti v končni kodi, razen če ga prej uporabite $sort
. Ta mehanika je potrebna, ker drugače ne morete zagotoviti vrstnega reda rezultata in ne boste mogli zanesljivo videti podatkov. Na vrhu rezultata boste glede na razvrščanje dobili različne vnose. Za zanesljivo delovanje morajo biti poizvedbe in združevanja deterministični, kar pomeni, da dajejo enake rezultate vsakič, ko se izvedejo. Koda, ki vsebuje $limit()
, vendar ne $sort
, ne bo determinističen in lahko posledično povzroči napake, ki jih bo težko izslediti.
Zaključek
Edini način, da ste razočarani nad MongoDB, je, da ga neposredno primerjate z drugo vrsto baze podatkov, kot je DBMS, ali da ga začnete uporabljati na podlagi določenih pričakovanj. To je tako, kot če bi pomarančo primerjali z vilicami. Sistemi baz podatkov služijo posebnim namenom. Najbolje je, da sami razumete in cenite te razlike. Škoda bi bilo pritiskati na razvijalce MongoDB zaradi poti, ki jih je prisilila na pot DBMS. Želim videti nove in zanimive načine za reševanje starih problemov, kot je zagotavljanje celovitosti podatkov in ustvarjanje podatkovnih sistemov, ki so odporni na napake in zlonamerne napade.
MongoDB-ova uvedba transakcijske transakcije ACID v različici 4.0 je dober primer uvajanja pomembnih izboljšav na inovativen način. Transakcije z več dokumenti in več izjavami so zdaj atomske. Prav tako je mogoče prilagoditi čas, potreben za pridobitev ključavnic in prekinitev zastalih transakcij, ter spremeniti stopnjo izolacije.
Preberi več:
Vir: www.habr.com