14 cose chì vogliu sapè prima di principià cù MongoDB

A traduzzione di l'articulu hè stata preparata à a vigilia di l'iniziu di u corsu "Base di dati non-relazionale".

14 cose chì vogliu sapè prima di principià cù MongoDB

Highlights:

  • Hè assai impurtante di sviluppà un schema ancu s'ellu hè opzionale in MongoDB.
  • In listessu modu, l'indici devenu cuncordà cù u vostru schema è i mudelli di accessu.
  • Evite l'usu di l'ogetti grossi è array grandi.
  • Attenti à i paràmetri di MongoDB, soprattuttu quandu si tratta di sicurità è affidabilità.
  • MongoDB ùn hà micca un ottimisatore di query, cusì deve esse attentu quandu eseguite operazioni di query.

Aghju travagliatu cù basa di dati per un tempu assai longu, ma solu pocu scupertu MongoDB. Ci hè uni pochi di cose chì vogliu sapè prima di cumincià à travaglià cun ellu. Quandu una persona hà digià spirienza in un certu campu, anu nozioni preconceived nantu à ciò chì e basa di dati sò è ciò chì facenu. In a speranza di fà più faciule per l'altri à capiscenu, aghju prisentatu una lista di sbagli cumuni.

Crià un servitore MongoDB senza autentificazione

Sfurtunatamente, MongoDB hè stallatu senza autentificazione per difettu. Per una stazione di travagliu accede à u locu, sta pratica hè normale. Ma siccomu MongoDB hè un sistema multi-utilizatori chì piace à utilizà una grande quantità di memoria, serà megliu s'ellu si mette nantu à un servitore cù a quantità di RAM pussibule, ancu s'è vo avete solu aduprà per u sviluppu. L'installazione nantu à u servitore via u portu predeterminatu pò esse problematicu, soprattuttu se qualsiasi codice javascript pò esse eseguitu in a dumanda (per esempiu, $where cum'è una idea per iniezioni).

Ci sò parechji metudi di autentificazione, ma u più faciule hè di stabilisce un ID d'utilizatore / password. Aduprate sta idea mentre pensate à l'autentificazione di fantasia basatu nantu LDAP. Quandu si tratta di sicurità, MongoDB deve esse aghjurnatu constantemente, è i logs sò sempre verificati per accessu micca autorizatu. Per esempiu, mi piace à selezziunà un portu sfarente cum'è u portu predeterminatu.

Ùn vi scurdate di ligà a superficia di attaccu à MongoDB

Lista di cuntrollu di sicurezza MongoDB cuntene boni cunsiglii per riduce u risicu di l'intrusione di a rete è a fuga di dati. Hè facilitu per spazzola è dì chì un servitore di sviluppu ùn hà micca bisognu di un altu livellu di sicurità. Tuttavia, ùn hè micca cusì simplice è questu hè applicatu à tutti i servitori MongoDB. In particulare, s'ellu ùn ci hè micca un mutivu convincente per aduprà mapReduce, group o $ induve, avete bisognu di disattivà l'usu di codice arbitrariu in JavaScript scrivendu in u schedariu di cunfigurazione javascriptEnabled:false. Siccomu i schedarii di dati ùn sò micca criptati in MongoDB standard, hè sensu per eseguisce MongoDB cun User Dedicatu, chì hà un accessu sanu à i schedari, cù un accessu limitatu solu à questu è a capacità di utilizà i cuntrolli d'accessu à i schedari di u sistema operatore.

Errore durante u sviluppu di u circuitu

MongoDB ùn usa micca un schema. Ma questu ùn significa micca chì u schema ùn hè micca necessariu. Se vulete solu almacenà i documenti senza un mudellu coherente, l'almacenamiento pò esse rapidu è faciule, ma ricuperà dopu pò esse difficiule. dannatamente duru.

Articulu classicu "6 Reguli di Puliziu per MongoDB Schema Design" Vale a pena una lettura, è caratteristiche cum'è Schema Explorer in u strumentu terzu-party Studio 3T, vale a pena aduprà per cuntrolli regulare di circuiti.

Ùn vi scurdate di l'ordine di sorte

Dimenticà l'ordine di sorte pò causà più frustrazione è perde più tempu chè qualsiasi altra cunfigurazione incorrecta. Per difettu, MongoBD usa sorte binaria. Ma hè improbabile chì sia utile à qualchissia. Case-sensitive, accentu-sensitive, sorte binari eranu cunsiderate anacronismi curiosi cù perle, caftani è mustachi ricci in l'anni 80 di u seculu passatu. Avà u so usu hè imperdonabile. In a vita vera, "motocicletta" hè u listessu cum'è "motocicletta". E "Gran Bretagna" è "Gran Bretagna" sò u listessu locu. Una lettera minuscula hè solu l'equivalente maiuscule di una lettera maiuscola. È ùn mi fate micca principià à a classificazione di i diacritici. Quandu crea una basa di dati in MongoDB, utilizate a colazione insensibile à l'accentu è iscrizzione, chì currisponde à a lingua è cultura di l'utilizatori di u sistema. Questu hà da fà a ricerca à traversu dati di stringa assai più faciule.

Crea cullezzione cù grandi documenti

MongoDB hè felice d'ospitu grandi documenti finu à 16MB in cullezzione, è GridFS Cuncepitu per grandi documenti più grande di 16 MB. Ma solu perchè i grandi documenti ponu esse piazzati quì, almacenà elli ùn hè micca una bona idea. MongoDB hà da travaglià megliu se guardate documenti individuali chì sò uni pochi di kilobyte in grandezza, trattendu più cum'è fila in una larga tabella SQL. Grandi documenti seranu una fonte di prublemi cù produtividade.

Creazione di documenti cù grandi matrici

I documenti ponu cuntene arrays. Hè megliu se u numeru di elementi in u array hè luntanu da un numeru di quattru cifre. Se l'elementi sò aghjuntu à una matrice spessu, u documentu chì u cuntene è deve esse move, chì significa chì serà necessariu aghjurnà ancu l'indici. Quandu si reindicizza un documentu cù una grande matrice, l'indici sò spessu sovrascritti, postu chì ci hè un arregistramentu, chì guarda u so indice. Questa re-indexazione si trova ancu quandu un documentu hè inseritu o sguassatu.

MongoDB hà qualcosa chjamatu "fattore di riempimentu", chì furnisce spaziu per i documenti per cresce per minimizzà stu prublema.
Puderete pensà chì pudete fà senza l'indexazione di array. Sfortunatamente, a mancanza d'indici pò causà altri prublemi. Siccomu i ducumenti sò scannati da u principiu à a fine, a ricerca di elementi à a fine di l'array duverà più, è a maiò parte di l'operazioni assuciate à un tali documentu saranu. lentu.

Ùn vi scurdate chì l'ordine di e tappe in una aggregazione importa

In un sistema di basa di dati cù un ottimisatore di query, e dumande chì scrivite sò spiegazioni di ciò chì vulete ottene, micca cumu ottene. Stu mekanismu funziona per analogia cù l'urdinamentu in un ristorante: di solitu, ordinate solu un platu, è ùn dà micca struzzioni dettagliate à u coccu.

In MongoDB, istruite u coccu. Per esempiu, avete bisognu di assicurà chì i dati passanu reduce quantu pussibule in u pipeline usendu $match и $project, è a classificazione si faci solu dopu reduce, è chì a ricerca passa esattamente in l'ordine chì vulete. Avè un ottimisatore di query chì elimina u travagliu innecessariu, sequenza in modu ottimale i passi, è selezziunate i tipi di cunghjunzione pò spoiler. Cù MongoDB, avete più cuntrollu à u costu di comodità.

Strumenti cum'è Studio 3T simplificà a custruzzione di e dumande di aggregazione in MongoDB. A funzione di l'Editor di Aggregazione permette di applicà dichjarazioni di pipeline una tappa à volta, è inspeccionà i dati di input è output in ogni tappa per una debugging più faciule.

Utilizà a registrazione rapida

Ùn mai impostate l'opzioni di scrittura MongoDB per avè alta velocità ma bassa affidabilità. Stu modu "file-and-forget" pari veloci perchè u cumandimu hè tornatu prima di a scrittura. Se u sistema falla prima chì i dati sò scritti à u discu, serà persu è finiscinu in un statu inconsistente. Per furtuna, 64-bit MongoDB hà attivatu u logu.

I mutori di almacenamento MMAPv1 è WiredTiger utilizanu logging per impediscenu questu, ancu s'è WiredTiger pò ricuperà à l'ultimu coherente. puntu di cuntrollu, se a registrazione hè disattivata.

Journaling assicura chì a basa di dati hè in un statu coherente dopu a ricuperazione è conserva tutte e dati finu à chì hè scrittu à u log. A frequenza di registrazioni hè cunfigurata cù u paràmetru commitIntervalMs.

Per esse sicuru di e voci, assicuratevi chì u logu hè attivatu in u schedariu di cunfigurazione (storage.journal.enabled), è a freccia di registrazioni currisponde à a quantità di informazioni chì pudete permette di perde.

Trià senza indice

Quandu cercate è aggregate, ci hè spessu bisognu di sorte i dati. Speremu chì questu hè fattu in una di e tappe finali, dopu avè filtratu u risultatu in modu di riduce a quantità di dati chì sò urdinati. E ancu in questu casu, per sorte avete bisognu indice. Pudete utilizà un indice unicu o cumpostu.

Se ùn ci hè micca un indice adattatu, MongoDB farà senza ellu. Ci hè un limitu di memoria di 32 MB nantu à a dimensione tutale di tutti i documenti in operazioni di sorte, è se MongoDB righjunghji stu limitu, allora o girà un errore o torna recordset viotu.

Ricerca senza supportu d'indici

E dumande di ricerca facenu una funzione simile à l'operazione JOIN in SQL. Per travaglià megliu, anu bisognu di l'indici di u valore di a chjave utilizata cum'è a chjave straniera. Questu ùn hè micca evidenti perchè l'usu ùn hè micca riflessu explain(). Tali indici sò in più di l'indici scrittu in explain(), chì à u turnu hè utilizatu da l'operatori di pipeline $match и $sort, quandu si scontranu à u principiu di u pipeline. L'indici ponu avà copre ogni stadiu pipeline di aggregazione.

Opzione di l'usu di l'aghjurnamenti multipli

Metu db.collection.update() utilizatu per cambià una parte di un documentu esistente o tuttu u documentu, finu à una sustituzione cumpleta, secondu u paràmetru chì specificate update. Ciò chì ùn hè micca cusì evidente hè chì ùn processerà micca tutti i documenti in a cullizzioni, salvu chì ùn fate micca l'opzione multi per aghjurnà tutti i documenti chì rispondenu à i criteri di dumanda.

Ùn vi scurdate di l'impurtanza di l'ordine di i chjavi in ​​una table hash

In JSON, un ughjettu hè custituitu da una cullizzioni disordinata di dimensione zero o più coppie nome / valore, induve u nome hè una stringa è u valore hè una stringa, numeru, boolean, null, object, o array.

Sfortunatamente, BSON mette assai enfasi in l'ordine quandu cerca. In MongoDB, l'ordine di e chjave in l'oggetti integrati tràttanu, à dì { firstname: "Phil", surname: "factor" } - questu ùn hè micca u listessu { { surname: "factor", firstname: "Phil" }. Questu hè, duvete almacenà l'ordine di coppie nome / valore in i vostri documenti se vulete esse sicuru di truvà.

Ùn vi cunfunditi "Null" и "indefinitu"

valore "indefinitu" ùn hè mai statu validu in JSON, secondu standard ufficiale JSON (ECMA-404 Section 5), ancu s'ellu hè utilizatu in JavaScript. Inoltre, per BSON hè obsolet è hè cunvertitu à $null, chì ùn hè micca sempre una bona suluzione. Evite aduprà "indefinitu" in MongoDB.

Usu $limit() senza $sort()

Piuttostu spessu quandu si sviluppa in MongoDB, hè utile per vede solu una mostra di u risultatu chì serà tornatu da una dumanda o aggregazione. Per questu compitu avete bisognu $limit(), ma ùn deve mai esse in u codice finale, salvu chì l'utilizate prima $sort. Stu meccanicu hè necessariu perchè altrimenti ùn pudete micca guarantiscia l'ordine di u risultatu, è ùn puderà micca vede in modu affidabile di e dati. À a cima di u risultatu, uttene diverse entrate secondu a classificazione. Per travaglià in modu affidabile, e dumande è aggregazioni devenu esse deterministiche, vale à dì, pruducenu i stessi risultati ogni volta chì sò eseguiti. Codice chì cuntene $limit(), ma nò $sort, ùn serà micca deterministicu è pò sussegwentemente causà errori chì saranu difficiuli di seguità.

cunchiusioni

L'unicu modu per esse disappuntu cù MongoDB hè di paragunà direttamente à un altru tipu di basa di dati, cum'è un DBMS, o di vene à aduprà nantu à certe aspettative. Hè cum'è paragunà un aranciu à una forchetta. I sistemi di basa di dati servenu scopi specifichi. Hè megliu solu capisce è apprezzà queste differenzi per sè stessu. Saria una vergogna di pressu à i sviluppatori di MongoDB nantu à una strada chì l'hà furzatu à u percorsu DBMS. Vogliu vede modi novi è interessanti per risolve i vechji prublemi, cum'è per assicurà l'integrità di e dati è a creazione di sistemi di dati chì sò resistenti à fallimentu è attacchi maliziusi.

L'intruduzione di a transazzione ACID di MongoDB in a versione 4.0 hè un bon esempiu di introduzzione di migliorie impurtanti in una manera innovativa. Multi-document è transazzione multi-dichjarazione sò avà atomicu. Hè ancu pussibule d'aghjurnà u tempu necessariu per acquistà chjusi è finisce e transacciones stuck, è ancu cambià u livellu di isolamentu.

14 cose chì vogliu sapè prima di principià cù MongoDB

Leghjite più:

Source: www.habr.com

Add a comment