Prijevod članka pripremljen je uoči početka kursa
Vrhunci:
- Izuzetno je važno razviti šemu iako je ona opciona u MongoDB-u.
- Isto tako, indeksi moraju odgovarati vašoj šemi i obrascima pristupa.
- Izbjegavajte korištenje velikih objekata i velikih nizova.
- Budite oprezni s MongoDB postavkama, posebno kada je riječ o sigurnosti i pouzdanosti.
- MongoDB nema optimizator upita, tako da morate biti pažljivi kada izvodite operacije upita.
Radim sa bazama podataka jako dugo, ali tek nedavno sam otkrio MongoDB. Postoji nekoliko stvari koje bih volio da znam prije nego što sam počeo raditi s tim. Kada osoba već ima iskustvo u određenoj oblasti, ona ima unaprijed stvorene predodžbe o tome šta su baze podataka i čime se bave. U nadi da ću drugima olakšati razumijevanje, predstavljam listu uobičajenih grešaka.
Kreiranje MongoDB servera bez autentifikacije
Nažalost, MongoDB se podrazumevano instalira bez autentifikacije. Za radnu stanicu kojoj se pristupa lokalno, ova praksa je normalna. Ali pošto je MongoDB višekorisnički sistem koji voli da koristi velike količine memorije, biće bolje da ga stavite na server sa što više RAM-a, čak i ako ćete ga koristiti samo za razvoj. Instaliranje na server preko zadanog porta može biti problematično, posebno ako se u zahtjevu može izvršiti bilo koji javascript kod (na primjer, $where
kao ideja za
Postoji nekoliko metoda provjere autentičnosti, ali najlakše je postaviti korisnički ID/lozinku. Koristite ovu ideju dok razmišljate o fensi autentifikaciji zasnovanoj na
Ne zaboravite da povežete površinu napada za MongoDB
,
ili
. Pošto datoteke podataka nisu šifrovane u standardnom MongoDB-u, ima smisla pokrenuti MongoDB sa njim
Greška pri razvoju kola
MongoDB ne koristi šemu. Ali to ne znači da shema nije potrebna. Ako samo želite pohraniti dokumente bez ikakvog dosljednog uzorka, njihovo pohranjivanje može biti brzo i jednostavno, ali kasnije njihovo preuzimanje može biti teško.
Klasičan članak"
Ne zaboravite redoslijed sortiranja
Zaboravljanje redoslijeda sortiranja može uzrokovati više frustracija i izgubiti više vremena nego bilo koja druga pogrešna konfiguracija. Po defaultu koristi MongoBD
Kreirajte kolekcije s velikim dokumentima
MongoDB rado ugošćuje velike dokumente do 16MB u zbirkama, i
Kreiranje dokumenata sa velikim nizovima
Dokumenti mogu sadržavati nizove. Najbolje je ako je broj elemenata u nizu daleko od četverocifrenog broja. Ako se elementi često dodaju u niz, on će prerasti dokument koji ga sadrži i moraće biti
MongoDB ima nešto što se zove
Možda mislite da možete bez indeksiranja niza. Nažalost, nedostatak indeksa može uzrokovati druge probleme. Budući da se dokumenti skeniraju od početka do kraja, traženje elemenata na kraju niza će trajati duže, a većina operacija povezanih s takvim dokumentom bit će
Ne zaboravite da je redoslijed faza u agregaciji bitan
U sistemu baze podataka sa optimizatorom upita, upiti koje pišete su objašnjenja šta želite da dobijete, a ne kako da to dobijete. Ovaj mehanizam funkcionira po analogiji s naručivanjem u restoranu: obično jednostavno naručite jelo, a ne date detaljne upute kuharu.
U MongoDB-u dajete uputstva kuvaru. Na primjer, morate biti sigurni da podaci prolaze reduce
što je ranije moguće u cjevovodu koristeći $match
и $project
, a sortiranje se događa tek nakon toga reduce
, i da se pretraga odvija upravo onim redoslijedom koji želite. Imati optimizator upita koji eliminiše nepotreban rad, optimalno sekvencira korake i bira tipove spajanja može vas razmaziti. Sa MongoDB, imate više kontrole po cijenu pogodnosti.
Alati poput
Korištenje brzog snimanja
Nikada nemojte postavljati opcije pisanja MongoDB tako da imaju veliku brzinu, ali nisku pouzdanost. Ovaj mod "snimi i zaboravi" izgleda brzo jer se naredba vraća prije nego što se upis dogodi. Ako se sistem sruši prije nego što se podaci zapišu na disk, bit će izgubljeni i završiti u nekonzistentnom stanju. Srećom, 64-bitni MongoDB ima omogućeno evidentiranje.
MMAPv1 i WiredTiger strojevi za pohranu koriste evidenciju kako bi spriječili ovo, iako se WiredTiger može oporaviti do posljednjeg dosljednog
Vođenje dnevnika osigurava da je baza podataka u konzistentnom stanju nakon oporavka i zadržava sve podatke dok se ne zapišu u dnevnik. Učestalost snimanja se konfiguriše pomoću parametra
.
Da biste bili sigurni u unose, provjerite je li evidentiranje omogućeno u konfiguracijskoj datoteci
, a učestalost snimanja odgovara količini informacija koju možete priuštiti da izgubite.
Sortiranje bez indeksa
Prilikom pretraživanja i agregiranja često postoji potreba za sortiranjem podataka. Nadajmo se da je to učinjeno u nekoj od završnih faza, nakon filtriranja rezultata kako bi se smanjila količina podataka koji se sortiraju. Čak iu ovom slučaju, za sortiranje će vam trebati
Ako nema odgovarajućeg indeksa, MongoDB će bez njega. Postoji ograničenje memorije od 32 MB za ukupnu veličinu svih dokumenata
Pretražujte bez podrške za indeks
Upiti za pretraživanje izvode funkciju sličnu operaciji JOIN u SQL-u. Da bi najbolje funkcionirali, potreban im je indeks vrijednosti ključa koji se koristi kao strani ključ. Ovo nije očigledno jer se upotreba ne odražava u explain()
. Takvi indeksi su dodatak indeksu upisanim explain()
, koji zauzvrat koriste operateri cjevovoda $match
и $sort
, kada se sastanu na početku gasovoda. Indeksi sada mogu pokriti bilo koju fazu
Odbijanje korištenja višestrukih ažuriranja
Metoda
koristi se za promjenu dijela postojećeg dokumenta ili cijelog dokumenta, do potpune zamjene, ovisno o parametru koji navedete
. Ono što nije tako očigledno je da neće obraditi sve dokumente u kolekciji osim ako ne postavite tu opciju
da ažurira sve dokumente koji ispunjavaju kriterijume zahteva.
Ne zaboravite na važnost redosleda ključeva u hash tabeli
U JSON-u, objekat se sastoji od neuređene kolekcije veličine nula ili više parova ime/vrijednost, gdje je ime niz, a vrijednost niz, broj, logički, null, objekt ili niz.
Nažalost, BSON stavlja veliki naglasak na red prilikom pretraživanja. U MongoDB, redoslijed ključeva unutar ugrađenih objekata { firstname: "Phil", surname: "factor" }
- ovo nije isto kao { { surname: "factor", firstname: "Phil" }
. To jest, morate pohraniti redoslijed parova ime/vrijednost u svojim dokumentima ako želite biti sigurni da ćete ih pronaći.
Nemojte se zbuniti "Null" и "nedefinisano"
vrijednost "nedefinisano" nikada nije bio važeći u JSON-u, prema $null
, što nije uvijek dobro rješenje.
Koristite $limit()
bez $sort()
Vrlo često kada razvijate u MongoDB-u, korisno je samo vidjeti uzorak rezultata koji će biti vraćen iz upita ili agregacije. Za ovaj zadatak će vam trebati $limit()
, ali nikada ne bi trebao biti u konačnom kodu osim ako ga ranije ne koristite $sort
. Ova mehanika je neophodna jer u suprotnom ne možete garantovati redosled rezultata i nećete moći pouzdano da vidite podatke. Na vrhu rezultata dobit ćete različite unose ovisno o sortiranju. Da bi radili pouzdano, upiti i agregacije moraju biti deterministički, odnosno proizvesti iste rezultate svaki put kada se izvrše. Kod koji sadrži $limit()
, ali ne $sort
, neće biti deterministički i može naknadno uzrokovati greške koje će biti teško ući u trag.
zaključak
Jedini način da budete razočarani MongoDB je da ga uporedite direktno sa drugom vrstom baze podataka, kao što je DBMS, ili da je počnete koristiti na osnovu određenih očekivanja. To je kao da porediš narandžu sa viljuškom. Sistemi baza podataka služe specifičnim svrhama. Najbolje je da jednostavno sami shvatite i cijenite ove razlike. Bila bi šteta vršiti pritisak na programere MongoDB oko putanje koja ih je natjerala na DBMS put. Želim vidjeti nove i zanimljive načine rješavanja starih problema, kao što je osiguranje integriteta podataka i stvaranje sistema podataka koji su otporni na kvar i zlonamjerne napade.
MongoDB-ovo uvođenje ACID transakcije u verziju 4.0 je dobar primjer uvođenja važnih poboljšanja na inovativan način. Transakcije sa više dokumenata i više izjava sada su atomske. Također je moguće podesiti vrijeme potrebno za preuzimanje zaključavanja i okončanje zaglavljenih transakcija, kao i promjenu nivoa izolacije.
Čitaj više:
izvor: www.habr.com