{"id":95148,"date":"2020-09-25T19:43:09","date_gmt":"2020-09-25T17:43:09","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb"},"modified":"2020-09-25T19:43:09","modified_gmt":"2020-09-25T17:43:09","slug":"14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb","title":{"rendered":"14 lucruri pe care a\u0219 fi dorit s\u0103 le \u0219tiu \u00eenainte de a \u00eencepe lucrul cu MongoDB","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>Articolul este tradus \u00een cadrul preg\u0103tirii pentru lansarea cursului <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/ZRL1\/\">\u00abBaze de date non rela\u021bionale\u00bb<\/a><\/noindex>.<\/i><\/b><\/p>\n<p><img decoding=\"async\" alt=\"14 lucruri pe care a\u0219 fi dorit s\u0103 le \u0219tiu \u00eenainte de a \u00eencepe lucrul cu MongoDB\" src=\"\/wp-content\/uploads\/2020\/09\/9b4979be27e0090543b28150d90fa8df.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Puncte cheie:<\/p>\n<ul>\n<li>Este extrem de important s\u0103 dezvolta\u021bi un schema, chiar dac\u0103 \u00een MongoDB aceasta nu este obligatorie.<\/li>\n<li>\u00cen mod similar, indicii trebuie s\u0103 corespund\u0103 schemei dumneavoastr\u0103 \u0219i modelelor de acces. <\/li>\n<li>Evita\u021bi utilizarea obiectelor mari \u0219i a unor matrice mari.<\/li>\n<li>Fi\u021bi aten\u021bi cu set\u0103rile MongoDB, mai ales c\u00e2nd este vorba de securitate \u0219i stabilitate.<\/li>\n<li>\u00cen MongoDB nu exist\u0103 un optimizator de interog\u0103ri, a\u0219a c\u0103 trebuie s\u0103 fi\u021bi pruden\u021bi atunci c\u00e2nd efectua\u021bi opera\u021biuni de interogare.<\/li>\n<\/ul>\n<p>\nLucrez cu baze de date de foarte mult timp, dar abia recent am descoperit MongoDB. Sunt c\u00e2teva aspecte pe care a\u0219 fi vrut s\u0103 le \u0219tiu \u00eenainte de a \u00eencepe s\u0103 lucrez cu ea. Atunci c\u00e2nd o persoan\u0103 are deja experien\u021b\u0103 \u00eentr-un anumit domeniu, are preconcepe\u021bii despre ce sunt bazele de date \u0219i ce fac acestea. Sper\u00e2nd s\u0103 u\u0219urez \u00een\u021belegerea pentru al\u021bii, prezint o list\u0103 de gre\u0219eli comune.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Crearea unui server MongoDB f\u0103r\u0103 autentificare<\/h3>\n<p>\nDin p\u0103cate, MongoDB este instalat\u0103, implicit, f\u0103r\u0103 autentificare. Pentru o sta\u021bie de lucru la care se acceseaz\u0103 local, aceast\u0103 practic\u0103 este normal\u0103. \u00cens\u0103, deoarece MongoDB este un sistem multi-utilizator care prefer\u0103 s\u0103 utilizeze resurse mari de memorie, ar fi mai bine s\u0103 o instalezi pe un server cu c\u00e2t mai mult\u0103 memorie RAM disponibil\u0103 \u00een condi\u021biile tale, chiar dac\u0103 inten\u021bionezi s\u0103 o folose\u0219ti doar pentru dezvoltare. Instalarea pe server prin portul implicit poate fi problematic\u0103, mai ales dac\u0103 se poate executa orice cod \u00een javascript \u00een interogare (de exemplu, <code>$where<\/code> ca idee pentru <noindex><a rel=\"nofollow\" href=\"https:\/\/lockmedown.com\/securing-node-js-mongodb-security-injection-attacks\/\">injection<\/a><\/noindex>). <\/p>\n<p>Exist\u0103 c\u00e2teva metode de autentificare, dar cea mai simpl\u0103 este s\u0103 configurezi un ID\/parol\u0103 pentru utilizator. Folose\u0219te aceast\u0103 idee p\u00e2n\u0103 c\u00e2nd te g\u00e2nde\u0219ti la o autentificare mai sofisticat\u0103 bazat\u0103 pe <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/security-ldap-external\/\">LDAP<\/a><\/noindex>. C\u00e2nd vine vorba de securitate, MongoDB trebuie s\u0103 fie actualizat\u0103 constant, iar jurnalele trebuie s\u0103 fie verificate \u00eentotdeauna pentru acces neautorizat. De exemplu, \u00eemi place s\u0103 aleg o alt\u0103 port\u0103 \u00een loc de portul implicit.<\/p>\n<h3>Nu uita s\u0103 legi suprafa\u021ba de atac de MongoDB<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/administration\/security-checklist\/\">Lista de verificare pentru securitatea MongoDB<\/a><\/noindex> ofer\u0103 sfaturi utile pentru reducerea riscului de acces neautorizat \u0219i scurgeri de date. Este u\u0219or s\u0103 ignori \u0219i s\u0103 spui c\u0103 un server pentru dezvoltare nu necesit\u0103 un nivel \u00eenalt de securitate. Totu\u0219i, lucrurile nu sunt at\u00e2t de simple \u0219i aceasta se aplic\u0103 tuturor serverelor MongoDB. \u00cen special, dac\u0103 nu exist\u0103 un motiv \u00eentemeiat pentru a folosi <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/command\/mapReduce\/#dbcmd.mapReduce\">mapReduce<\/a><\/noindex><\/code>, <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/command\/group\/#dbcmd.group\">grup<\/a><\/noindex><\/code> sau <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/operator\/query\/where\/#op._S_where\">$where<\/a><\/noindex>, trebuie dezactivat\u0103 utilizarea codului JavaScript arbitrar, scriind \u00een fi\u0219ierul de configurare <code><noindex><a rel=\"nofollow\" href=\"https:\/\/lockmedown.com\/securing-node-js-mongodb-security-injection-attacks\/\">javascriptActivat:false<\/a><\/noindex><\/code>. Deoarece \u00een MongoDB standard fi\u0219ierele de date nu sunt criptate, este recomandat s\u0103 porni\u021bi MongoDB cu <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/administration\/security-checklist\/#run-mongodb-with-a-dedicated-user\">Utilizator dedicat<\/a><\/noindex>, care are acces complet la fi\u0219iere, cu acces restric\u021bionat doar pentru acesta \u0219i capacitatea de a folosi propriile instrumente de gestionare a accesului la fi\u0219iere ale sistemului de operare.<\/p>\n<h3>Eroare \u00een proiectarea schemei<\/h3>\n<p>\nMongoDB nu folose\u0219te o schem\u0103. Dar asta nu \u00eenseamn\u0103 c\u0103 schema nu este necesar\u0103. Dac\u0103 dori\u021bi doar s\u0103 stoca\u021bi documente f\u0103r\u0103 o schem\u0103 coerent\u0103, le pute\u021bi salva rapid \u0219i simplu, dar recuperarea lor poate fi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.compose.com\/articles\/mongodb-with-and-without-schemas\/\">extrem de complicat\u0103<\/a><\/noindex>. <\/p>\n<p>Articolul clasic \u201e<i><noindex><a rel=\"nofollow\" href=\"https:\/\/www.mongodb.com\/blog\/post\/6-rules-of-thumb-for-mongodb-schema-design-part-1\">6 reguli empirice pentru proiectarea schemelor MongoDB\u201d<\/a><\/noindex><\/i> merit\u0103 citit, iar func\u021bii precum <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/knowledge-base\/articles\/schema-explorer\/\">Explorator de scheme<\/a><\/noindex> \u00een instrumentul ter\u021b Studio 3T ar trebui utilizate pentru verific\u0103ri regulate ale schemelor.<\/p>\n<h3>Nu uita\u021bi de ordinea de sortare<\/h3>\n<p>\nIgnorarea ordinii de sortare poate fi cea mai frustrant\u0103 \u0219i s\u0103 consume mai mult timp dec\u00e2t utilizarea oric\u0103rei alte configura\u021bii gre\u0219ite. \u00cen mod implicit, MongoDB utilizeaz\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/jira.mongodb.org\/browse\/SERVER-1920\">sortarea binar\u0103<\/a><\/noindex>. Dar este pu\u021bin probabil s\u0103 fie de ajutor. Sort\u0103rile sensibile la majuscule, diacritice, binare au fost considerate ni\u0219te anacronisme, \u00eempreun\u0103 cu m\u0103rgele, kaftane \u0219i must\u0103\u021bi r\u0103sucite, \u00eenc\u0103 din anii '80. Acum utilizarea lor este inacceptabil\u0103. \u00cen via\u021ba real\u0103, \u201emotoceclul\u201d este acela\u0219i lucru cu \u201eMotoceclul\u201d. Iar \u201eBritania\u201d \u0219i \u201ebritania\u201d sunt acela\u0219i loc. Litera mic\u0103 este pur \u0219i simplu echivalentul mare al unei litere mari. \u0218i nu m\u0103 face\u021bi s\u0103 discut despre sortarea diacriticelor. C\u00e2nd crea\u021bi o baz\u0103 de date \u00een MongoDB, utiliza\u021bi parametrii de sortare f\u0103r\u0103 \u021binerea cont de diacritice \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/weblogs.sqlteam.com\/dang\/archive\/2009\/07\/26\/Collation-Hell-Part-1.aspx\">majuscule<\/a><\/noindex>, care corespund limbii \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/derickrethans.nl\/mongodb-collation-revised.html\">culturii utilizatorilor sistemului<\/a><\/noindex>. Astfel, ve\u021bi simplifica semnificativ c\u0103utarea \u00een datele de tip \u0219ir.<\/p>\n<h3>Crearea colec\u021biilor cu documente mari<\/h3>\n<p>\nMongoDB este \u00eenc\u00e2ntat s\u0103 stocheze documente mari de p\u00e2n\u0103 la 16 MB \u00een colec\u021bii, iar <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/gridfs\/#gridfs\">GridFS<\/a><\/noindex> este destinat documentelor mari care dep\u0103\u0219esc 16 MB. Dar, doar pentru c\u0103 documentele mari pot fi stocate acolo, nu este neap\u0103rat cea mai bun\u0103 idee s\u0103 le p\u0103strezi acolo. Cel mai bine, MongoDB va func\u021biona dac\u0103 ve\u021bi salva documente individuale de c\u00e2\u021biva kilobi\u021bi, consider\u00e2ndu-le mai degrab\u0103 ca pe ni\u0219te r\u00e2nduri \u00eentr-un tabel SQL larg. Documentele mari vor fi surse de probleme cu <noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/mongodb\/comments\/573fqr\/question_mongodb_terrible_performance_for_a\/\">performan\u021b\u0103<\/a><\/noindex>.<\/p>\n<h3>Crearea documentelor cu array-uri mari <\/h3>\n<p>\nDocumentele pot con\u021bine array-uri. Este ideal ca num\u0103rul de elemente din array s\u0103 fie departe de un num\u0103r de patru cifre. Dac\u0103 elementele din array sunt ad\u0103ugate frecvent, se va dep\u0103\u0219i documentul care le con\u021bine \u0219i va trebui s\u0103 fie <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.mongodb.org\/manual\/core\/data-model-operations\/#document-growth\">mutat<\/a><\/noindex>, ceea ce \u00eenseamn\u0103 c\u0103 va trebui s\u0103 <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.mongodb.org\/manual\/core\/write-performance\/#document-growth\">actualiz\u0103m \u0219i indexurile<\/a><\/noindex>. La reindexarea unui document cu un array mare, indexurile sunt adesea rescrise, deoarece pentru fiecare element exist\u0103 <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.mongodb.org\/manual\/core\/index-multikey\/\">o \u00eenregistrare<\/a><\/noindex>, care stocheaz\u0103 indexul s\u0103u. O astfel de reindexare are loc \u0219i atunci c\u00e2nd un document este inserat sau \u0219ters. <\/p>\n<p>\u00cen MongoDB exist\u0103 a\u0219a-numitul <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/mmapv1\/#record-allocation-strategies\">\u00abcoeficient de umplere\u00bb<\/a><\/noindex>, care ofer\u0103 spa\u021biu pentru cre\u0219terea documentelor, pentru a minimiza aceast\u0103 problem\u0103. <br \/>\nAr putea p\u0103rea c\u0103 te po\u021bi descurca f\u0103r\u0103 indexarea array-urilor. Din p\u0103cate, din cauza lipsei indexurilor, pot ap\u0103rea alte probleme. Deoarece documentele sunt vizualizate de la \u00eenceput p\u00e2n\u0103 la sf\u00e2r\u0219it, c\u0103utarea elementelor la sf\u00e2r\u0219itul array-ului va dura mai mult, iar majoritatea opera\u021biunilor legate de un astfel de document vor fi <noindex><a rel=\"nofollow\" href=\"http:\/\/grokbase.com\/t\/gg\/mongodb-user\/128r0h5gzw\/inserting-into-300-000-size-embedded-array-is-slow-even-w-o-indexes\">\u00eencete<\/a><\/noindex>. <\/p>\n<h3>Nu uita\u021bi c\u0103 ordinea etapelor \u00een agregare conteaz\u0103<\/h3>\n<p>\n\u00centr-un sistem de baze de date cu un optimizer de interog\u0103ri, interog\u0103rile pe care le scrie\u021bi sunt explica\u021bii ale a ceea ce dori\u021bi s\u0103 ob\u021bine\u021bi, nu ale modului \u00een care s\u0103 ob\u021bine\u021bi. Acest mecanism func\u021bioneaz\u0103 pe un principiu similar cu comanda \u00eentr-un restaurant: de obicei, comanda\u021bi un fel de m\u00e2ncare, nu da\u021bi instruc\u021biuni detaliate buc\u0103tarului.<\/p>\n<p>\u00cen MongoDB, \u00eei instrui\u021bi pe buc\u0103tari. De exemplu, trebuie s\u0103 v\u0103 asigura\u021bi c\u0103 datele trec prin <code>reduce<\/code> c\u00e2t mai devreme \u00een pipeline folosind <code>$match<\/code> \u0219i <code>$project<\/code>, iar sortarea se face doar dup\u0103 <code>reduce<\/code>, \u0219i c\u0103 c\u0103utarea se desf\u0103\u0219oar\u0103 exact \u00een ordinea \u00een care ai nevoie. Oferirea unui optimizator de interog\u0103ri, care elimin\u0103 muncile inutile, ordoneaz\u0103 optim etapele \u0219i selecteaz\u0103 tipul de conexiune, te poate r\u0103sf\u0103\u021ba. \u00cen MongoDB, ai mai mult control asupra costului confortului.<\/p>\n<p>Instrumente precum <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/\">Studio 3T<\/a><\/noindex> simplific\u0103 construirea interog\u0103rilor de agregare \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/knowledge-base\/articles\/build-mongodb-aggregation-queries\/\">MongoDB<\/a><\/noindex>. Func\u021bia Aggregation Editor \u00ee\u021bi va permite s\u0103 aplici operatori de pipeline c\u00e2te unul pe r\u00e2nd, precum \u0219i s\u0103 verifici datele de intrare \u0219i ie\u0219ire la fiecare etap\u0103 pentru a simplifica debugging-ul. <\/p>\n<h3>Folosirea scrierii rapide<\/h3>\n<p>\nNu seta niciodat\u0103 \u00een MongoDB parametrii de scriere cu vitez\u0103 mare, dar cu fiabilitate sc\u0103zut\u0103. Acest mod <i>\"file-and-forget\"<\/i> pare rapid, deoarece comanda returneaz\u0103 \u00eenainte de a efectua scrierea. Dac\u0103 sistemul se pr\u0103bu\u0219e\u0219te \u00eenainte ca datele s\u0103 fie scrise pe disc, acestea se vor pierde \u0219i vor fi \u00eentr-o stare nesincronizat\u0103. Din fericire, \u00een MongoDB pe 64 de bi\u021bi este activat logging-ul. <\/p>\n<p>Motoarele de stocare MMAPv1 \u0219i WiredTiger folosesc logging-ul pentru a preveni acest lucru, de\u0219i WiredTiger se poate recupera p\u00e2n\u0103 la ultimul <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/wiredtiger\/#storage-wiredtiger-checkpoints\">punct de control<\/a><\/noindex>, dac\u0103 logging-ul este dezactivat.<\/p>\n<p>Logging-ul garanteaz\u0103 c\u0103 baza de date se afl\u0103 \u00eentr-o stare sincronizat\u0103 dup\u0103 recuperare \u0219i p\u0103streaz\u0103 toate datele p\u00e2n\u0103 la momentul \u00eenregistr\u0103rii \u00een jurnal. Frecven\u021ba \u00eenregistr\u0103rilor este reglat\u0103 prin parametrul <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/configuration-options\/#storage.journal.commitIntervalMs\">intervalDeCommitMs<\/a><\/noindex><\/code>. <\/p>\n<p>Pentru a te asigura de \u00eenregistr\u0103ri, asigur\u0103-te c\u0103 \u00een fi\u0219ierul de configurare logging-ul este activat <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/configuration-options\/#configuration-file\">(storage.journal.enabled)<\/a><\/noindex>)<\/code>, iar frecven\u021ba \u00eenregistr\u0103rilor corespunde volumului de informa\u021bii pe care \u00ee\u021bi po\u021bi permite s\u0103-l pierzi.<\/p>\n<h3>Sortare f\u0103r\u0103 index<\/h3>\n<p>\nAtunci c\u00e2nd cau\u021bi \u0219i agreghezi, apare adesea necesitatea de a sorta datele. S\u0103 sper\u0103m c\u0103 acest lucru se face pe una dintre etapele finale, dup\u0103 filtrarea rezultatelor pentru a reduce volumul de date sortate. \u0218i chiar \u0219i \u00een acest caz, pentru sortare vei avea nevoie de <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/knowledge-base\/articles\/mongodb-index-strategy\/\">indexul<\/a><\/noindex>. Po\u021bi folosi un index singular sau compus. <\/p>\n<p>Dac\u0103 nu exist\u0103 un index adecvat, MongoDB se va descurca f\u0103r\u0103 el. Exist\u0103 o limit\u0103 de memorie de 32 MB pentru dimensiunea total\u0103 a tuturor documentelor \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.org\/manual\/reference\/limits\/#Sort-Operations\">opera\u021biunea de sortare<\/a><\/noindex>, iar dac\u0103 MongoDB atinge aceast\u0103 limit\u0103, aceasta va genera fie o eroare, fie va returna <noindex><a rel=\"nofollow\" href=\"https:\/\/www.sitepoint.com\/7-simple-speed-solutions-mongodb\/\">un set de \u00eenregistr\u0103ri gol<\/a><\/noindex>.<\/p>\n<h3>C\u0103utare f\u0103r\u0103 suport pentru indici<\/h3>\n<p>\nInterog\u0103rile de c\u0103utare \u00eendeplinesc o func\u021bie similar\u0103 cu opera\u021bia JOIN \u00een SQL. Pentru o performan\u021b\u0103 optim\u0103, au nevoie de un index al valorii cheii utilizate ca cheie extern\u0103. Acest lucru nu este evident, deoarece utilizarea acestuia nu este reflectat\u0103 \u00een <code>explain()<\/code>. Aceste indec\u0219i sunt un supliment la indexul \u00eenregistrat \u00een <code>explain()<\/code>, care la r\u00e2ndul s\u0103u este utilizat de operatorii de pipeline <code>$match<\/code> \u0219i <code>$sort<\/code>, atunci c\u00e2nd ace\u0219tia apar la \u00eenceputul pipeline-ului. Indec\u0219ii pot acum s\u0103 acopere orice etap\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/aggregation-pipeline\/#aggregation-pipeline-operators-and-performance\">a pipeline-ului de agregare<\/a><\/noindex>. <\/p>\n<h3>Renun\u021barea la utilizarea actualiz\u0103rilor multiple<\/h3>\n<p>\nMetoda <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/db.collection.update\/\">db.collection.update()<\/a><\/noindex><\/code> este utilizat\u0103 pentru a modifica o parte dintr-un document existent sau un \u00eentreg document, p\u00e2n\u0103 la o \u00eenlocuire complet\u0103 \u00een func\u021bie de parametru specificat de tine <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/db.collection.update\/#update-parameter\">update<\/a><\/noindex><\/code>. Nu este at\u00e2t de evident c\u0103 acesta nu va procesa toate documentele din colec\u021bie p\u00e2n\u0103 nu setezi parametrul <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/db.collection.update\/#multi-parameter\">multi<\/a><\/noindex><\/code> pentru a actualiza toate documentele care respect\u0103 criteriile cererii.<\/p>\n<h3>Nu uita de importan\u021ba ordinii cheilor \u00een tabela hash<\/h3>\n<p>\n\u00cen JSON, un obiect const\u0103 dintr-o colec\u021bie neordonat\u0103 de zero sau mai multe perechi nume\/valoare, unde numele este un \u0219ir, iar valoarea este un \u0219ir, un num\u0103r, o valoare boolean\u0103, zero, un obiect sau un array.<\/p>\n<p>Din p\u0103cate, BSON pune un accent deosebit pe ordine \u00een timpul c\u0103ut\u0103rilor. \u00cen MongoDB, ordinea cheilor din interiorul obiectelor \u00eencorporate <noindex><a rel=\"nofollow\" href=\"http:\/\/devblog.me\/wtf-mongo\">are valoarea<\/a><\/noindex>, adic\u0103 <code>{ firstname: \"Phil\", surname: \"factor\" }<\/code> \u2013 nu este acela\u0219i lucru cu <code>{ { surname: \"factor\", firstname: \"Phil\" }<\/code>. Asta \u00eenseamn\u0103 c\u0103 trebuie s\u0103 p\u0103strezi \u00een documente ordinea perechilor nume\/valoare dac\u0103 vrei s\u0103 te asiguri c\u0103 le vei g\u0103si.<\/p>\n<h3>Nu confunda <i>\"null\"<\/i> \u0219i <i>\"undefined\"<\/i><\/h3>\n<p>\nValoare <i>\"undefined\"<\/i> care nu a fost niciodat\u0103 permis \u00een JSON, conform <noindex><a rel=\"nofollow\" href=\"http:\/\/www.ecma-international.org\/publications\/files\/ECMA-ST\/ECMA-404.pdf\">standardului oficial<\/a><\/noindex> JSON (ECMA-404, Sec\u021biunea 5), de\u0219i este utilizat \u00een JavaScript. Mai mult, pentru BSON este dep\u0103\u0219it \u0219i este transformat \u00een <code>$null<\/code>, ceea ce nu este \u00eentotdeauna o solu\u021bie bun\u0103. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/meteor\/meteor\/issues\/1646#issuecomment-29682964\">Evit\u0103 utilizarea <i>\"undefined\"<\/i> \u00een MongoDB<\/a><\/noindex>.<\/p>\n<h3>Utilizare <code>$limit()<\/code> f\u0103r\u0103 <code>$sort()<\/code><\/h3>\n<p>\nFoarte des, atunci c\u00e2nd dezvol\u021bi \u00een MongoDB, este util s\u0103 vezi doar un e\u0219antion de rezultat care va fi returnat dintr-o cerere sau o agregare. Pentru aceast\u0103 sarcin\u0103, \u00ee\u021bi va fi de folos <code>$limit()<\/code>, dar acesta nu ar trebui s\u0103 existe niciodat\u0103 \u00een versiunea final\u0103 a codului, dec\u00e2t dac\u0103 \u00eenainte de el nu folose\u0219ti <code>$sort<\/code>. Aceast\u0103 mecanic\u0103 este necesar\u0103 deoarece, altfel, nu po\u021bi garanta ordinea rezultatelor \u0219i nu vei putea vizualiza datele \u00een mod fiabil. \u00cen partea superioar\u0103 a rezultatului, vei ob\u021bine diferite \u00eenregistr\u0103ri \u00een func\u021bie de sortare. Pentru a func\u021biona corect, interog\u0103rile \u0219i agreg\u0103rile trebuie s\u0103 fie determinate, adic\u0103 s\u0103 ofere acelea\u0219i rezultate la fiecare execu\u021bie. Codul care con\u021bine <code>$limit()<\/code>, dar nu con\u021bine <code>$sort<\/code>, nu va fi considerat determinat \u0219i poate cauza erori care vor fi greu de urm\u0103rit.<\/p>\n<h3>Concluzie<\/h3>\n<p>\nSingurul mod de a fi dezam\u0103git de MongoDB este s\u0103 o compari direct cu alt tip de baze de date, cum ar fi SGBD-urile, sau s\u0103 te apropii de utilizarea ei av\u00e2nd anumite a\u0219tept\u0103ri. E ca \u0219i cum ai compara o portocal\u0103 cu o furculi\u021b\u0103. Sistemele de baze de date urm\u0103resc obiective specifice. E cel mai bine s\u0103 \u00een\u021belegi \u0219i s\u0103 apreciezi aceste diferen\u021be. Ar fi jenant s\u0103 apesi pe dezvoltatorii MongoDB din cauza c\u0103ii pe care au fost nevoi\u021bi s\u0103 o urmeze \u00een calitate de SGBD. \u00cemi doresc s\u0103 v\u0103d modalit\u0103\u021bi noi \u0219i interesante de a rezolva problemele vechi, cum ar fi asigurarea integrit\u0103\u021bii datelor \u0219i crearea de sisteme de date rezistente la defec\u021biuni \u0219i atacuri cibernetice.<\/p>\n<p>Implementarea tranzac\u021bionalit\u0103\u021bii ACID \u00een MongoDB \u00een versiunea 4.0 este un bun exemplu de implementare a unor \u00eembun\u0103t\u0103\u021biri importante printr-o abordare inovatoare. Tranzac\u021biile multi-document \u0219i multi-operator sunt acum atomice. De asemenea, a ap\u0103rut posibilitatea de a regla timpul necesar pentru ob\u021binerea blocajelor \u0219i de a \u00eencheia tranzac\u021bii blocate, precum \u0219i de a modifica nivelul de izolare.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/ZRL1\/\"><img decoding=\"async\" alt=\"14 lucruri pe care a\u0219 fi dorit s\u0103 le \u0219tiu \u00eenainte de a \u00eencepe lucrul cu MongoDB\" src=\"\/wp-content\/uploads\/2020\/09\/9966ff2613efab52aac99c2a0eda5c87.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<h3>Cite\u0219te mai mult:<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/519340\/\">Cum s\u0103 \u00eencarci date \u00een Google BigQuery<\/a><\/noindex><\/li>\n<\/ul>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/520412\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430 \u00ab\u041d\u0435\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\u00bb. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b: \u041a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 MongoDB \u043e\u043d\u0430 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 \u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u0418\u0437\u0431\u0435\u0433\u0430\u0439\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432. \u0411\u0443\u0434\u044c\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 MongoDB, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438. \u0412 MongoDB [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95149,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95148","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430 \u00ab\u041d\u0435\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\u00bb.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd4714 \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0437\u043d\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 MongoDB | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430 \u00ab\u041d\u0435\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\u00bb.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-25T17:43:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-25T17:43:09+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd4714 lucruri pe care a\u0219 fi vrut s\u0103 le \u0219tiu \u00eenainte de a \u00eencepe s\u0103 lucrez cu MongoDB | ProHoster","description":"Traducerea articolului a fost preg\u0103tit\u0103 \u00een anticipationa \u00eenceperii cursului \u201eBaze de date nerela\u021bionale\u201d.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd4714 \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0437\u043d\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 MongoDB | ProHoster","og:description":"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430 \u00ab\u041d\u0435\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\u00bb.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-25T17:43:09+00:00","article:modified_time":"2020-09-25T17:43:09+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95148","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:11:32","updated":"2022-10-03 07:39:33","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/95148","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=95148"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/95148\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/95149"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=95148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=95148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=95148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}