Preklad článku bol pripravený v predstihu pred začiatkom kurzu
prednosti:
- Je mimoriadne dôležité vyvinúť schému, aj keď je v MongoDB voliteľná.
- Podobne aj indexy musia zodpovedať vašej schéme a vzorom prístupu.
- Vyhnite sa používaniu veľkých objektov a veľkých polí.
- Buďte opatrní s nastaveniami MongoDB, najmä pokiaľ ide o bezpečnosť a spoľahlivosť.
- MongoDB nemá optimalizátor dotazov, takže pri vykonávaní operácií dotazov musíte byť opatrní.
S databázami pracujem už veľmi dlho, no len nedávno som objavil MongoDB. Je pár vecí, ktoré by som chcel vedieť skôr, ako som s tým začal pracovať. Keď už má človek skúsenosti v určitej oblasti, má vopred vytvorené predstavy o tom, čo databázy sú a čo robia. V nádeji, že to ostatným uľahčím, uvádzam zoznam bežných chýb.
Vytvorenie servera MongoDB bez autentifikácie
Bohužiaľ, MongoDB je štandardne nainštalovaný bez autentifikácie. Pre pracovnú stanicu s lokálnym prístupom je tento postup normálny. Ale keďže MongoDB je systém pre viacerých používateľov, ktorý rád využíva veľké množstvo pamäte, bude lepšie, ak ho umiestnite na server s čo najväčším množstvom pamäte RAM, aj keď ho budete používať iba na vývoj. Inštalácia na server cez predvolený port môže byť problematická, najmä ak je možné v požiadavke spustiť akýkoľvek javascriptový kód (napr. $where
ako nápad na
Есть несколько методов аутентификации, но проще всего установить для пользователя ID/пароль. Воспользуйтесь этой идеей, пока будете думать над причудливой аутентификацией на основе
Nezabudnite naviazať útočný povrch na MongoDB
,
alebo
. Keďže dátové súbory nie sú šifrované v štandardnom MongoDB, má zmysel spustiť MongoDB
Chyba pri vývoji obvodu
MongoDB nepoužíva schému. To však neznamená, že schéma nie je potrebná. Ak chcete iba ukladať dokumenty bez akéhokoľvek konzistentného vzoru, ich ukladanie môže byť rýchle a jednoduché, ale ich neskoršie načítanie môže byť náročné.
Klasický článok"
Nezabudnite na poradie triedenia
Zabudnutie poradia triedenia môže spôsobiť väčšiu frustráciu a stratu času ako akákoľvek iná nesprávna konfigurácia. Štandardne používa MongoBD
Vytvárajte zbierky s veľkými dokumentmi
MongoDB s radosťou hosťuje veľké dokumenty až do 16 MB v zbierkach a
Vytváranie dokumentov s veľkými poľami
Dokumenty môžu obsahovať polia. Najlepšie je, ak je počet prvkov v poli ďaleko od štvormiestneho čísla. Ak sa prvky pridávajú do poľa často, prerastie dokument, ktorý ho obsahuje, a bude potrebné
MongoDB má niečo tzv
Možno si myslíte, že sa zaobídete bez indexovania poľa. Bohužiaľ, nedostatok indexov môže spôsobiť ďalšie problémy. Keďže dokumenty sa skenujú od začiatku do konca, vyhľadávanie prvkov na konci poľa bude trvať dlhšie a väčšina operácií spojených s takýmto dokumentom bude
Nezabudnite, že na poradí fáz v agregácii záleží
V databázovom systéme s optimalizátorom dotazov sú dotazy, ktoré píšete, vysvetleniami toho, čo chcete získať, nie ako to získať. Tento mechanizmus funguje analogicky s objednávaním v reštaurácii: zvyčajne si jednoducho objednáte jedlo a kuchárovi nedávate podrobné pokyny.
V MongoDB dávate pokyn kuchárovi. Musíte sa napríklad uistiť, že údaje prechádzajú reduce
čo najskôr v potrubí pomocou $match
и $project
a triedenie sa uskutoční až po reduce
a že vyhľadávanie prebieha presne v požadovanom poradí. Mať optimalizátor dotazov, ktorý eliminuje zbytočnú prácu, optimálne sekvenuje kroky a vyberá typy spojení, vás môže pokaziť. S MongoDB máte väčšiu kontrolu za cenu pohodlia.
Nástroje ako
Používanie rýchleho nahrávania
Nikdy nenastavujte možnosti zápisu MongoDB tak, aby mali vysokú rýchlosť, ale nízku spoľahlivosť. Tento režim "zapíš a zabudni" sa zdá byť rýchly, pretože príkaz sa vráti skôr, ako dôjde k zápisu. Ak systém zlyhá pred zápisom údajov na disk, stratí sa a skončí v nekonzistentnom stave. Našťastie 64-bitový MongoDB má povolené protokolovanie.
Úložné motory MMAPv1 a WiredTiger používajú protokolovanie, aby tomu zabránili, hoci WiredTiger sa dokáže obnoviť do posledného konzistentného
Žurnálovanie zaisťuje, že databáza je po obnove v konzistentnom stave a uchováva všetky údaje, kým nie sú zapísané do žurnálu. Frekvencia nahrávania sa konfiguruje pomocou parametra
.
Aby ste si boli istí položkami, skontrolujte, či je v konfiguračnom súbore povolené protokolovanie
a frekvencia nahrávania zodpovedá množstvu informácií, ktoré si môžete dovoliť stratiť.
Triedenie bez indexu
Pri vyhľadávaní a agregovaní často vzniká potreba triediť dáta. Dúfajme, že sa tak stane v jednej z posledných fáz, po filtrovaní výsledku, aby sa znížilo množstvo triedených údajov. A aj v tomto prípade budete na triedenie potrebovať
Ak neexistuje vhodný index, MongoDB sa bez neho zaobíde. Celková veľkosť všetkých dokumentov v pamäti je obmedzená na 32 MB
Vyhľadávanie bez podpory indexu
Vyhľadávacie dotazy vykonávajú funkciu podobnú operácii JOIN v SQL. Aby fungovali čo najlepšie, potrebujú index hodnoty kľúča použitého ako cudzí kľúč. To nie je zrejmé, pretože použitie sa neodráža v explain()
. Takéto indexy sú navyše k indexu zapísané v explain()
, ktorý zase využívajú prevádzkovatelia potrubí $match
и $sort
, keď sa stretnú na začiatku potrubia. Indexy teraz môžu pokrývať akúkoľvek fázu
Zrušenie používania viacerých aktualizácií
metóda
slúži na zmenu časti existujúceho dokladu alebo celého dokladu až po úplnú výmenu v závislosti od zadaného parametra
. Čo nie je také zrejmé je, že nespracuje všetky dokumenty v kolekcii, pokiaľ túto možnosť nenastavíte
aktualizovať všetky dokumenty, ktoré spĺňajú kritériá žiadosti.
Nezabudnite na dôležitosť poradia kľúčov v hašovacej tabuľke
V JSON objekt pozostáva z neusporiadanej kolekcie veľkosti nula alebo viacerých párov názov/hodnota, kde názov je reťazec a hodnota je reťazec, číslo, boolean, null, objekt alebo pole.
Bohužiaľ, BSON kladie veľký dôraz na poriadok pri hľadaní. V MongoDB poradie kľúčov v rámci vstavaných objektov { firstname: "Phil", surname: "factor" }
- to nie je to isté ako { { surname: "factor", firstname: "Phil" }
. To znamená, že ak chcete mať istotu pri ich nájdení, musíte si v dokumentoch uložiť poradie párov názov/hodnota.
Nenechajte sa zmiasť "Nulový" и "nedefinované"
Hodnota "nedefinované" nebol nikdy platný v JSON, podľa $null
, čo nie je vždy dobré riešenie.
Použitie $limit()
bez $sort()
Pomerne často, keď vyvíjate v MongoDB, je užitočné vidieť len vzorku výsledku, ktorý sa vráti z dotazu alebo agregácie. Pre túto úlohu budete potrebovať $limit()
, ale nikdy by nemal byť v konečnom kóde, pokiaľ ho predtým nepoužijete $sort
. Táto mechanika je potrebná, pretože inak nemôžete zaručiť poradie výsledku a nebudete môcť spoľahlivo zobraziť údaje. V hornej časti výsledku sa zobrazia rôzne položky v závislosti od zoradenia. Aby dotazy a agregácie fungovali spoľahlivo, musia byť deterministické, to znamená, že pri každom vykonaní musia produkovať rovnaké výsledky. Kód, ktorý obsahuje $limit()
, ale nie $sort
, nebude deterministický a môže následne spôsobiť chyby, ktoré bude ťažké vystopovať.
Záver
Jediný spôsob, ako byť sklamaný z MongoDB, je porovnať ho priamo s iným typom databázy, ako je DBMS, alebo ju začať používať na základe určitých očakávaní. Je to ako porovnávať pomaranč s vidličkou. Databázové systémy slúžia na špecifické účely. Najlepšie je jednoducho pochopiť a oceniť tieto rozdiely pre seba. Bola by škoda tlačiť na vývojárov MongoDB cez cestu, ktorá ich prinútila ísť cestou DBMS. Chcem vidieť nové a zaujímavé spôsoby riešenia starých problémov, ako je zabezpečenie integrity údajov a vytváranie systémov údajov, ktoré sú odolné voči zlyhaniu a škodlivým útokom.
Zavedenie transakcie ACID od MongoDB vo verzii 4.0 je dobrým príkladom zavádzania dôležitých vylepšení inovatívnym spôsobom. Transakcie s viacerými dokumentmi a viacerými výpismi sú teraz atomické. Je tiež možné upraviť čas potrebný na získanie zámkov a ukončenie zaseknutých transakcií, ako aj zmeniť úroveň izolácie.
Čítaj viac:
Zdroj: hab.com