Traducerea articolului a fost pregătită în ajunul începerii cursului
Repere:
- Este extrem de important să dezvoltați o schemă, chiar dacă este opțională în MongoDB.
- De asemenea, indecșii trebuie să se potrivească cu schema și modelele de acces.
- Evitați să utilizați obiecte mari și matrice mari.
- Fiți atenți la setările MongoDB, mai ales când vine vorba de securitate și fiabilitate.
- MongoDB nu are un optimizator de interogări, așa că trebuie să fiți atenți când efectuați operațiuni de interogare.
Lucrez cu baze de date de foarte mult timp, dar abia recent am descoperit MongoDB. Sunt câteva lucruri pe care mi-aș dori să le știu înainte de a începe să lucrez cu el. Când o persoană are deja experiență într-un anumit domeniu, are noțiuni preconcepute despre ce sunt bazele de date și ce fac. În speranța de a face mai ușor de înțeles pentru ceilalți, vă prezint o listă de greșeli frecvente.
Crearea unui server MongoDB fără autentificare
Din păcate, MongoDB este instalat fără autentificare în mod implicit. Pentru o stație de lucru accesată local, această practică este normală. Dar, deoarece MongoDB este un sistem multi-utilizator căruia îi place să folosească cantități mari de memorie, va fi mai bine dacă îl puneți pe un server cu cât mai multă RAM, chiar dacă îl veți folosi doar pentru dezvoltare. Instalarea pe server prin portul implicit poate fi problematică, mai ales dacă orice cod javascript poate fi executat în cerere (de exemplu, $where
ca idee pentru
Există mai multe metode de autentificare, dar cea mai ușoară este să setați un ID de utilizator/parolă. Utilizați această idee în timp ce vă gândiți la autentificarea fantezie bazată pe
Nu uitați să legați suprafața de atac la MongoDB
,
sau
. Deoarece fișierele de date nu sunt criptate în MongoDB standard, este logic să rulați MongoDB cu
Eroare la dezvoltarea circuitului
MongoDB nu folosește o schemă. Dar asta nu înseamnă că schema nu este necesară. Dacă doriți doar să stocați documente fără niciun model consistent, stocarea acestora poate fi rapidă și ușoară, dar recuperarea lor mai târziu poate fi dificilă.
articol clasic "
Nu uitați de ordinea de sortare
Uitarea ordinii de sortare poate provoca mai multă frustrare și pierde mai mult timp decât orice altă configurație incorectă. În mod implicit, MongoBD utilizează
Creați colecții cu documente mari
MongoDB este bucuros să găzduiască documente mari de până la 16 MB în colecții și
Crearea de documente cu matrice mari
Documentele pot conține matrice. Cel mai bine este dacă numărul de elemente din matrice este departe de un număr de patru cifre. Dacă elementele sunt adăugate frecvent într-o matrice, acesta va depăși documentul care îl conține și va trebui să fie
MongoDB are ceva numit
Ai putea crede că te poți descurca fără indexarea matricei. Din nefericire, lipsa indicilor vă poate cauza alte probleme. Deoarece documentele sunt scanate de la început până la sfârșit, căutarea elementelor la sfârșitul matricei va dura mai mult și majoritatea operațiunilor asociate cu un astfel de document vor fi
Nu uitați că ordinea etapelor într-o agregare contează
Într-un sistem de baze de date cu un optimizator de interogări, interogările pe care le scrieți sunt explicații pentru ceea ce doriți să obțineți, nu cum să îl obțineți. Acest mecanism funcționează prin analogie cu comanda într-un restaurant: de obicei, comandați pur și simplu un fel de mâncare și nu oferiți instrucțiuni detaliate bucătarului.
În MongoDB, instruiți bucătarul. De exemplu, trebuie să vă asigurați că datele trec reduce
cât mai devreme posibil în conductă folosind $match
и $project
, iar sortarea are loc numai după reduce
, și că căutarea are loc exact în ordinea dorită. Deținerea unui optimizator de interogări care elimină munca inutilă, secvențiază în mod optim pașii și selectează tipurile de alăturare te poate răsfăța. Cu MongoDB, aveți mai mult control cu prețul confortului.
Instrumente ca
Utilizarea Înregistrării rapide
Nu setați niciodată opțiunile de scriere MongoDB pentru a avea viteză mare, dar fiabilitate scăzută. Acest mod "fisare si uitare" pare rapid deoarece comanda este returnată înainte de scrierea. Dacă sistemul se blochează înainte ca datele să fie scrise pe disc, acestea se vor pierde și vor ajunge într-o stare inconsistentă. Din fericire, MongoDB pe 64 de biți are înregistrarea activată.
Motoarele de stocare MMAPv1 și WiredTiger folosesc înregistrarea în jurnal pentru a preveni acest lucru, deși WiredTiger poate reveni la ultima consecvență.
Jurnalizarea asigură că baza de date este într-o stare consecventă după recuperare și păstrează toate datele până când sunt scrise în jurnal. Frecvența înregistrărilor este configurată cu ajutorul parametrului
.
Pentru a fi sigur de intrări, asigurați-vă că înregistrarea este activată în fișierul de configurare
, iar frecvența înregistrărilor corespunde cantității de informații pe care vă puteți permite să o pierdeți.
Sortare fără index
Când căutați și agregați, este adesea nevoie să sortați datele. Să sperăm că acest lucru se face într-una din etapele finale, după filtrarea rezultatului pentru a reduce cantitatea de date sortate. Și chiar și în acest caz, pentru sortare veți avea nevoie
Dacă nu există un index adecvat, MongoDB se va descurca fără el. Există o limită de memorie de 32 MB pentru dimensiunea totală a tuturor documentelor din
Căutați fără suport pentru index
Interogările de căutare îndeplinesc o funcție similară cu operația JOIN din SQL. Pentru a funcționa cel mai bine, au nevoie de indexul valorii cheii utilizate ca cheie externă. Acest lucru nu este evident deoarece utilizarea nu este reflectată în explain()
. Astfel de indici sunt în plus față de indicele înscris explain()
, care la rândul său este folosit de operatorii de conducte $match
и $sort
, când se întâlnesc la începutul conductei. Indecii pot acoperi acum orice etapă
Renunțarea la utilizarea mai multor actualizări
metodă
folosit pentru a schimba o parte dintr-un document existent sau întregul document, până la o înlocuire completă, în funcție de parametrul pe care îl specificați
. Ceea ce nu este atât de evident este că nu va procesa toate documentele din colecție decât dacă setați opțiunea
să actualizeze toate documentele care îndeplinesc criteriile de solicitare.
Nu uitați de importanța ordinii cheilor într-un tabel hash
În JSON, un obiect constă dintr-o colecție neordonată de dimensiune zero sau mai multe perechi nume/valoare, unde nume este un șir și valoare este un șir, număr, boolean, nul, obiect sau matrice.
Din păcate, BSON pune mult accent pe comandă atunci când caută. În MongoDB, ordinea cheilor în obiectele încorporate { firstname: "Phil", surname: "factor" }
- aceasta nu este la fel ca { { surname: "factor", firstname: "Phil" }
. Adică trebuie să stocați ordinea perechilor nume/valoare în documentele dvs. dacă doriți să fiți sigur că le găsiți.
Nu confunda "nul" и "nedefinit"
Valoare "nedefinit" nu a fost niciodată valabil în JSON, conform $null
, ceea ce nu este întotdeauna o soluție bună.
Folosi $limit()
fără $sort()
Destul de des, atunci când dezvoltați în MongoDB, este util să vedeți doar un eșantion de rezultat care va fi returnat dintr-o interogare sau agregare. Pentru această sarcină veți avea nevoie $limit()
, dar nu ar trebui să fie niciodată în codul final decât dacă îl utilizați înainte $sort
. Acest mecanic este necesar deoarece altfel nu puteți garanta ordinea rezultatului și nu veți putea vizualiza în mod fiabil datele. În partea de sus a rezultatului veți obține diferite intrări în funcție de sortare. Pentru a funcționa fiabil, interogările și agregările trebuie să fie deterministe, adică să producă aceleași rezultate de fiecare dată când sunt executate. Cod care contine $limit()
, dar nu $sort
, nu va fi determinist și poate cauza ulterior erori care vor fi greu de urmărit.
Concluzie
Singura modalitate de a fi dezamăgit de MongoDB este să-l compari direct cu un alt tip de bază de date, precum un DBMS, sau să ajungi să-l folosești pe baza anumitor așteptări. Este ca și cum ai compara o portocală cu o furculiță. Sistemele de baze de date servesc unor scopuri specifice. Cel mai bine este să înțelegi și să apreciezi pur și simplu aceste diferențe pentru tine. Ar fi păcat să presăm dezvoltatorii MongoDB pentru o cale care i-a forțat pe calea DBMS. Vreau să văd modalități noi și interesante de a rezolva problemele vechi, cum ar fi asigurarea integrității datelor și crearea de sisteme de date care sunt rezistente la eșec și atacuri rău intenționate.
Introducerea de către MongoDB a tranzacționalității ACID în versiunea 4.0 este un bun exemplu de introducere a îmbunătățirilor importante într-un mod inovator. Tranzacțiile cu mai multe documente și cu mai multe extrase sunt acum atomice. De asemenea, este posibil să se ajusteze timpul necesar pentru a obține încuietori și pentru a încheia tranzacțiile blocate, precum și pentru a modifica nivelul de izolare.
Citeste mai mult:
Sursa: www.habr.com