{"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\/pl\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb","title":{"rendered":"14 rzeczy, kt\u00f3re chcia\u0142bym wiedzie\u0107 przed rozpocz\u0119ciem pracy z MongoDB","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>Przek\u0142ad artyku\u0142u przygotowany przed rozpocz\u0119ciem kursu <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/ZRL1\/\">Bazy danych NoSQL<\/a><\/noindex>.<\/i><\/b><\/p>\n<p><img decoding=\"async\" alt=\"14 rzeczy, kt\u00f3re chcia\u0142bym wiedzie\u0107 przed rozpocz\u0119ciem pracy z MongoDB\" src=\"\/wp-content\/uploads\/2020\/09\/9b4979be27e0090543b28150d90fa8df.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Najwa\u017cniejsze punkty:<\/p>\n<ul>\n<li>Niezwykle istotne jest opracowanie schematu, mimo \u017ce w MongoDB jest on opcjonalny.<\/li>\n<li>Podobnie, indeksy musz\u0105 odpowiada\u0107 twojemu schematowi i wzorcom dost\u0119pu. <\/li>\n<li>Unikaj u\u017cywania du\u017cych obiekt\u00f3w i du\u017cych tablic.<\/li>\n<li>Zachowaj ostro\u017cno\u015b\u0107 z ustawieniami MongoDB, szczeg\u00f3lnie je\u015bli chodzi o bezpiecze\u0144stwo i niezawodno\u015b\u0107.<\/li>\n<li>W MongoDB nie ma optymalizatora zapyta\u0144, wi\u0119c musisz by\u0107 ostro\u017cny przy wykonywaniu operacji zapyta\u0144.<\/li>\n<\/ul>\n<p>\nPracuj\u0119 z bazami danych od bardzo d\u0142ugiego czasu, ale dopiero niedawno odkry\u0142em MongoDB. Jest kilka rzeczy, kt\u00f3re chcia\u0142bym wiedzie\u0107 przed rozpocz\u0119ciem pracy z ni\u0105. Kiedy kto\u015b ma ju\u017c do\u015bwiadczenie w danej dziedzinie, ma swoje wcze\u015bniejsze wyobra\u017cenia o tym, czym s\u0105 bazy danych i co robi\u0105. Aby u\u0142atwi\u0107 zrozumienie innym ludziom, przedstawiam list\u0119 powszechnych b\u0142\u0119d\u00f3w.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Utworzenie serwera MongoDB bez uwierzytelniania<\/h3>\n<p>\nNiestety, MongoDB domy\u015blnie jest instalowana bez uwierzytelniania. Dla stacji roboczej, do kt\u00f3rej dost\u0119p uzyskuje si\u0119 lokalnie, taka praktyka jest w porz\u0105dku. Ale poniewa\u017c MongoDB jest systemem wielodost\u0119pnym, kt\u00f3ry lubi korzysta\u0107 z du\u017cych ilo\u015bci pami\u0119ci, lepiej by\u0142oby, gdyby\u015b zainstalowa\u0142 j\u0105 na serwerze z maksymaln\u0105 ilo\u015bci\u0105 pami\u0119ci RAM, jak\u0105 mo\u017cesz mie\u0107 w tych warunkach, nawet je\u015bli zamierzasz u\u017cywa\u0107 jej tylko do rozwoju. Instalacja na serwerze przez domy\u015blny port mo\u017ce by\u0107 problematyczna, szczeg\u00f3lnie, je\u015bli w zapytaniu mo\u017cna wykona\u0107 dowolny kod JavaScript (np. <code>$where<\/code> jako pomys\u0142 na <noindex><a rel=\"nofollow\" href=\"https:\/\/lockmedown.com\/securing-node-js-mongodb-security-injection-attacks\/\">wstrzykni\u0119cia<\/a><\/noindex>). <\/p>\n<p>Istnieje kilka metod uwierzytelniania, ale naj\u0142atwiej jest ustawi\u0107 ID\/has\u0142o dla u\u017cytkownika. Skorzystaj z tego pomys\u0142u, podczas gdy my\u015blisz o fantazyjnej uwierzytelnianiu opartej na <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/security-ldap-external\/\">LDAP<\/a><\/noindex>. Je\u015bli m\u00f3wimy o bezpiecze\u0144stwie, to MongoDB powinna by\u0107 stale aktualizowana, a logi zawsze nale\u017cy sprawdza\u0107 pod k\u0105tem nieautoryzowanego dost\u0119pu. Na przyk\u0142ad, lubi\u0119 wybiera\u0107 inny port jako port domy\u015blny.<\/p>\n<h3>Nie zapomnij powi\u0105za\u0107 powierzchni ataku z MongoDB<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/administration\/security-checklist\/\">Lista kontrolna zabezpiecze\u0144 MongoDB<\/a><\/noindex> zawiera dobre porady dotycz\u0105ce zmniejszenia ryzyka nieautoryzowanego dost\u0119pu do sieci i wycieku danych. \u0141atwo jest zlekcewa\u017cy\u0107 i powiedzie\u0107, \u017ce serwer deweloperski nie wymaga wysokiego poziomu bezpiecze\u0144stwa. Jednak sprawy nie s\u0105 takie proste i odnosi si\u0119 to do wszystkich serwer\u00f3w MongoDB. W szczeg\u00f3lno\u015bci, je\u015bli nie ma przekonuj\u0105cego powodu do u\u017cycia <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\">grupa<\/a><\/noindex><\/code> lub <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/operator\/query\/where\/#op._S_where\">$where<\/a><\/noindex>, nale\u017cy wy\u0142\u0105czy\u0107 mo\u017cliwo\u015b\u0107 uruchamiania dowolnego kodu w JavaScript, zmieniaj\u0105c plik konfiguracyjny <code><noindex><a rel=\"nofollow\" href=\"https:\/\/lockmedown.com\/securing-node-js-mongodb-security-injection-attacks\/\">javascriptEnabled:false<\/a><\/noindex><\/code>. Poniewa\u017c w standardowej MongoDB pliki danych nie s\u0105 szyfrowane, rozs\u0105dnie jest uruchamia\u0107 MongoDB z <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/administration\/security-checklist\/#run-mongodb-with-a-dedicated-user\">Dedykowany u\u017cytkownik<\/a><\/noindex>, kt\u00f3ry ma pe\u0142ny dost\u0119p do plik\u00f3w, z ograniczonym dost\u0119pem tylko dla niego oraz mo\u017cliwo\u015bci\u0105 korzystania z w\u0142asnych narz\u0119dzi zarz\u0105dzania dost\u0119pem do plik\u00f3w systemu operacyjnego.<\/p>\n<h3>B\u0142\u0105d w projektowaniu schematu<\/h3>\n<p>\nMongoDB nie korzysta z schematu. Ale to nie znaczy, \u017ce schemat jest zb\u0119dny. Je\u015bli chcesz po prostu przechowywa\u0107 dokumenty bez jakiegokolwiek zharmonizowanego schematu, mo\u017cna je szybko i \u0142atwo przechowa\u0107, ale ich p\u00f3\u017aniejsze wydobycie mo\u017ce by\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.compose.com\/articles\/mongodb-with-and-without-schemas\/\">niezwykle trudne<\/a><\/noindex>. <\/p>\n<p>Klasyczny artyku\u0142 \u201e<i><noindex><a rel=\"nofollow\" href=\"https:\/\/www.mongodb.com\/blog\/post\/6-rules-of-thumb-for-mongodb-schema-design-part-1\">6 empirycznych zasad projektowania schemat\u00f3w MongoDB\u201d<\/a><\/noindex><\/i> wart jest przeczytania, a takie funkcje jak <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/knowledge-base\/articles\/schema-explorer\/\">Schema Explorer<\/a><\/noindex> w zewn\u0119trznym narz\u0119dziu Studio 3T s\u0105 warte wykorzystania do regularnych kontroli schemat\u00f3w.<\/p>\n<h3>Nie zapomnij o porz\u0105dku sortowania<\/h3>\n<p>\nZapominaj\u0105c o porz\u0105dku sortowania, mo\u017cna do\u015bwiadczy\u0107 najwi\u0119kszego rozczarowania i straci\u0107 wi\u0119cej czasu ni\u017c przy u\u017cyciu jakiejkolwiek innej b\u0142\u0119dnej konfiguracji. Domy\u015blnie MongoBD u\u017cywa <noindex><a rel=\"nofollow\" href=\"https:\/\/jira.mongodb.org\/browse\/SERVER-1920\">sortowania binarnego<\/a><\/noindex>. Ale ma\u0142o kto uzna to za u\u017cyteczne. Wra\u017cliwe na wielko\u015b\u0107 liter i akcentowanie, sortowanie binarne uwa\u017ca\u0142o si\u0119 za ciekawy anachronizm, podobnie jak koralik\u00f3w, kaftany i kr\u0119cone w\u0105sy jeszcze w latach 80. XX wieku. Teraz ich u\u017cycie jest nie do przyj\u0119cia. W rzeczywisto\u015bci \u201emotocykl\u201d to to samo, co \u201eMotocykl\u201d. A \u201eWielka Brytania\u201d i \u201ewielka brytania\u201d to to samo miejsce. Ma\u0142a litera to po prostu wielka litera w r\u00f3wnowa\u017cnej formie. I nie zmuszaj mnie, bym m\u00f3wi\u0142 o sortowaniu znak\u00f3w diakrytycznych. Przy tworzeniu bazy danych w MongoDB u\u017cywaj parametr\u00f3w sortowania, kt\u00f3re nie uwzgl\u0119dniaj\u0105 akcent\u00f3w i <noindex><a rel=\"nofollow\" href=\"https:\/\/weblogs.sqlteam.com\/dang\/archive\/2009\/07\/26\/Collation-Hell-Part-1.aspx\">wielko\u015bci liter<\/a><\/noindex>, kt\u00f3re odpowiadaj\u0105 j\u0119zykowi i <noindex><a rel=\"nofollow\" href=\"https:\/\/derickrethans.nl\/mongodb-collation-revised.html\">kulturze u\u017cytkownik\u00f3w systemu<\/a><\/noindex>. W ten spos\u00f3b znacz\u0105co upro\u015bcisz wyszukiwanie w danych tekstowych.<\/p>\n<h3>Tworzenie kolekcji z du\u017cymi dokumentami<\/h3>\n<p>\nMongoDB umo\u017cliwia przechowywanie du\u017cych dokument\u00f3w o rozmiarze do 16 MB w kolekcjach, a <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/gridfs\/#gridfs\">GridFS<\/a><\/noindex> jest przeznaczone do du\u017cych dokument\u00f3w o rozmiarze przekraczaj\u0105cym 16 MB. Jednak tylko dlatego, \u017ce mo\u017cna tam przechowywa\u0107 du\u017ce dokumenty, nie jest to najlepszy pomys\u0142. Najlepiej MongoDB dzia\u0142a, gdy przechowujesz pojedyncze dokumenty o rozmiarze kilku kilobajt\u00f3w, traktuj\u0105c je bardziej jak wiersze w szerokiej tabeli SQL. Du\u017ce dokumenty b\u0119d\u0105 \u017ar\u00f3d\u0142em problem\u00f3w z <noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/mongodb\/comments\/573fqr\/question_mongodb_terrible_performance_for_a\/\">wydajno\u015bci\u0105<\/a><\/noindex>.<\/p>\n<h3>Tworzenie dokument\u00f3w z du\u017cymi tablicami <\/h3>\n<p>\nDokumenty mog\u0105 zawiera\u0107 tablice. Najlepiej, je\u015bli liczba element\u00f3w w tablicy jest znacznie mniejsza ni\u017c cztery cyfry. Je\u015bli elementy s\u0105 cz\u0119sto dodawane do tablicy, przekroczy ona zawieraj\u0105cy j\u0105 dokument i b\u0119dzie trzeba j\u0105 <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.mongodb.org\/manual\/core\/data-model-operations\/#document-growth\">przenie\u015b\u0107<\/a><\/noindex>, co oznacza, \u017ce trzeba b\u0119dzie <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.mongodb.org\/manual\/core\/write-performance\/#document-growth\">zaktualizowa\u0107 i indeksy<\/a><\/noindex>. Podczas ponownej indeksacji dokumentu z du\u017c\u0105 tablic\u0105, indeksy cz\u0119sto b\u0119d\u0105 nadpisywane, poniewa\u017c dla ka\u017cdego elementu istnieje <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.mongodb.org\/manual\/core\/index-multikey\/\">zapis<\/a><\/noindex>, przechowuj\u0105cy jego indeks. Taka ponowna indeksacja wyst\u0119puje r\u00f3wnie\u017c, gdy dokument jest dodawany lub usuwany. <\/p>\n<p>W MongoDB istnieje tzw. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/mmapv1\/#record-allocation-strategies\">\u201ewska\u017anik wype\u0142nienia\u201d<\/a><\/noindex>, kt\u00f3ry zapewnia przestrze\u0144 na rozw\u00f3j dokument\u00f3w, aby zminimalizowa\u0107 ten problem. <br \/>\nMo\u017cesz pomy\u015ble\u0107, \u017ce mo\u017cna obej\u015b\u0107 si\u0119 bez indeksacji tablic. Niestety, z powodu braku indeks\u00f3w mog\u0105 pojawi\u0107 si\u0119 inne problemy. Poniewa\u017c dokumenty s\u0105 przeszukiwane od pocz\u0105tku do ko\u0144ca, wyszukiwanie element\u00f3w na ko\u0144cu tablicy zajmie wi\u0119cej czasu, a wi\u0119kszo\u015b\u0107 operacji zwi\u0105zanych z takim dokumentem b\u0119dzie <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\">wolna<\/a><\/noindex>. <\/p>\n<h3>Nie zapomnij, \u017ce kolejno\u015b\u0107 etap\u00f3w w agregacji ma znaczenie<\/h3>\n<p>\nW systemie baz danych z optymalizatorem zapyta\u0144, zapytania, kt\u00f3re piszesz, s\u0105 wyja\u015bnieniami tego, co chcesz uzyska\u0107, a nie tym, jak to osi\u0105gn\u0105\u0107. Taki mechanizm dzia\u0142a na podobie\u0144stwo zam\u00f3wienia w restauracji: zwykle po prostu zamawiasz danie, a nie dajesz szczeg\u00f3\u0142owych instrukcji kucharzowi.<\/p>\n<p>W MongoDB instruujesz kucharza. Na przyk\u0142ad, musisz upewni\u0107 si\u0119, \u017ce dane przechodz\u0105 przez <code>reduce<\/code> jak najszybciej w pipeline za pomoc\u0105 <code>$match<\/code> i <code>$project<\/code>, a sortowanie odbywa si\u0119 dopiero po <code>reduce<\/code>, i \u017ce wyszukiwanie odbywa si\u0119 dok\u0142adnie w tym porz\u0105dku, w jakim potrzebujesz. Posiadanie optymalizatora zapyta\u0144, kt\u00f3ry eliminuje zb\u0119dn\u0105 prac\u0119, optymalnie porz\u0105dkuje etapy i wybiera typ po\u0142\u0105czenia, mo\u017ce Ci\u0119 rozpie\u015bci\u0107. W MongoDB masz wi\u0119ksz\u0105 kontrol\u0119 nad cen\u0105 wygody.<\/p>\n<p>Takie narz\u0119dzia jak <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/\">Studio 3T<\/a><\/noindex> u\u0142atwi\u0105 tworzenie zapyta\u0144 agregacyjnych w <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/knowledge-base\/articles\/build-mongodb-aggregation-queries\/\">MongoDB<\/a><\/noindex>. Funkcja Aggregation Editor pozwoli Ci stosowa\u0107 operatory potok\u00f3w jeden etap za razem oraz sprawdza\u0107 dane wej\u015bciowe i wyj\u015bciowe na ka\u017cdym etapie dla u\u0142atwienia debugowania. <\/p>\n<h3>U\u017cywanie szybkiej rejestracji<\/h3>\n<p>\nNigdy nie ustawiaj w MongoDB parametr\u00f3w rejestracji z wysok\u0105 pr\u0119dko\u015bci\u0105, ale nisk\u0105 niezawodno\u015bci\u0105. Ten tryb <i>\u00abfile-and-forget\u00bb<\/i> wydaje si\u0119 szybki, poniewa\u017c polecenie zwraca si\u0119 przed zapisaniem. Je\u015bli system zawiedzie przed zapisaniem danych na dysku, zostan\u0105 one utracone i znajd\u0105 si\u0119 w niesp\u00f3jnym stanie. Na szcz\u0119\u015bcie w 64-bitowym MongoDB w\u0142\u0105czone jest dziennikowanie. <\/p>\n<p>Silniki przechowywania MMAPv1 i WiredTiger u\u017cywaj\u0105 dziennikowania, aby temu zapobiec, chocia\u017c WiredTiger mo\u017ce przywr\u00f3ci\u0107 si\u0119 do ostatniego sp\u00f3jnego <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/wiredtiger\/#storage-wiredtiger-checkpoints\">punktu kontrolnego<\/a><\/noindex>, je\u015bli dziennikowanie jest wy\u0142\u0105czone.<\/p>\n<p>Dziennikowanie zapewnia, \u017ce baza danych znajduje si\u0119 w sp\u00f3jnym stanie po przywr\u00f3ceniu i przechowuje wszystkie dane do momentu zapisu w dzienniku. Cz\u0119stotliwo\u015b\u0107 zapis\u00f3w jest konfigurowana za pomoc\u0105 parametru <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/configuration-options\/#storage.journal.commitIntervalMs\">commitIntervalMs<\/a><\/noindex><\/code>. <\/p>\n<p>Aby mie\u0107 pewno\u015b\u0107 co do zapis\u00f3w, upewnij si\u0119, \u017ce w pliku konfiguracyjnym dziennikowanie jest w\u0142\u0105czone <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/configuration-options\/#configuration-file\">(storage.journal.w\u0142\u0105czone<\/a><\/noindex>)<\/code>, a cz\u0119stotliwo\u015b\u0107 zapis\u00f3w odpowiada ilo\u015bci informacji, kt\u00f3r\u0105 mo\u017cesz sobie pozwoli\u0107 straci\u0107.<\/p>\n<h3>Sortowanie bez indeksu<\/h3>\n<p>\nPodczas wyszukiwania i agregacji cz\u0119sto zachodzi potrzeba sortowania danych. Miejmy nadziej\u0119, \u017ce dzieje si\u0119 to na jednym z ostatnich etap\u00f3w, po filtrowaniu wynik\u00f3w w celu zmniejszenia obj\u0119to\u015bci sortowanych danych. I nawet w takim przypadku do sortowania potrzebny b\u0119dzie <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/knowledge-base\/articles\/mongodb-index-strategy\/\">indeks<\/a><\/noindex>. Mo\u017cna u\u017cy\u0107 indeksu pojedynczego lub z\u0142o\u017conego. <\/p>\n<p>Je\u015bli odpowiedniego indeksu nie ma, MongoDB poradzi sobie bez niego. Istnieje ograniczenie pami\u0119ci wynosz\u0105ce 32 MB na ca\u0142kowity rozmiar wszystkich dokument\u00f3w w <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.org\/manual\/reference\/limits\/#Sort-Operations\">operacji sortowania<\/a><\/noindex>, a je\u015bli MongoDB osi\u0105gnie ten limit, to wyda b\u0142\u0105d lub zwr\u00f3ci <noindex><a rel=\"nofollow\" href=\"https:\/\/www.sitepoint.com\/7-simple-speed-solutions-mongodb\/\">pusty zestaw rekord\u00f3w<\/a><\/noindex>.<\/p>\n<h3>Wyszukiwanie bez wsparcia indeks\u00f3w<\/h3>\n<p>\nZapytania wyszukiwania pe\u0142ni\u0105 funkcj\u0119 podobn\u0105 do operacji JOIN w SQL. Aby dzia\u0142a\u0142y lepiej, potrzebuj\u0105 indeksu warto\u015bci klucza u\u017cywanego jako klucz obcy. To nie jest oczywiste, poniewa\u017c u\u017cycie nie jest odzwierciedlone w <code>explain()<\/code>. Takie indeksy s\u0105 uzupe\u0142nieniem indeksu zapisanego w <code>explain()<\/code>, kt\u00f3ry z kolei jest u\u017cywany przez operator\u00f3w pipeline <code>$match<\/code> i <code>$sort<\/code>, gdy pojawiaj\u0105 si\u0119 na pocz\u0105tku pipeline. Indeksy mog\u0105 teraz obejmowa\u0107 dowolny etap <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/aggregation-pipeline\/#aggregation-pipeline-operators-and-performance\">pipeline'a agregacji<\/a><\/noindex>. <\/p>\n<h3>Rezygnacja z wielokrotnych aktualizacji<\/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> jest u\u017cywana do zmiany cz\u0119\u015bci istniej\u0105cego dokumentu lub ca\u0142ego dokumentu, a\u017c do pe\u0142nej wymiany, w zale\u017cno\u015bci od zadanego parametru <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/db.collection.update\/#update-parameter\">update<\/a><\/noindex><\/code>. Nie jest tak oczywiste, \u017ce nie przetworzy wszystkich dokument\u00f3w w kolekcji, dop\u00f3ki nie ustawisz parametru <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/db.collection.update\/#multi-parameter\">multi<\/a><\/noindex><\/code> aby zaktualizowa\u0107 wszystkie dokumenty spe\u0142niaj\u0105ce kryteria zapytania.<\/p>\n<h3>Nie zapomnij o znaczeniu kolejno\u015bci kluczy w tablicy haszuj\u0105cej<\/h3>\n<p>\nW JSON obiekt sk\u0142ada si\u0119 z nieuporz\u0105dkowanej kolekcji zerowej lub wi\u0119kszej par klucz\/warto\u015b\u0107, gdzie klucz to ci\u0105g znak\u00f3w, a warto\u015b\u0107 to ci\u0105g znak\u00f3w, liczba, warto\u015b\u0107 logiczna, zero, obiekt lub tablica.<\/p>\n<p>Niestety, BSON przyk\u0142ada du\u017c\u0105 wag\u0119 do kolejno\u015bci podczas wyszukiwania. W MongoDB kolejno\u015b\u0107 kluczy wewn\u0105trz wbudowanych obiekt\u00f3w <noindex><a rel=\"nofollow\" href=\"http:\/\/devblog.me\/wtf-mongo\">ma warto\u015b\u0107<\/a><\/noindex>, tzn. <code>{ firstname: \"Phil\", surname: \"factor\" }<\/code> nie jest to samo co <code>{ { surname: \"factor\", firstname: \"Phil\" }}<\/code>. Oznacza to, \u017ce musisz zachowa\u0107 kolejno\u015b\u0107 par klucz\/warto\u015b\u0107 w dokumentach, je\u015bli chcesz mie\u0107 pewno\u015b\u0107, \u017ce je znajdziesz.<\/p>\n<h3>Nie myl <i>\"null\"<\/i> i <i>\"undefined\"<\/i><\/h3>\n<p>\nWarto\u015b\u0107 <i>\"undefined\"<\/i> nigdy nie by\u0142y dozwolone w JSON, zgodnie z <noindex><a rel=\"nofollow\" href=\"http:\/\/www.ecma-international.org\/publications\/files\/ECMA-ST\/ECMA-404.pdf\">oficjalnym standardem<\/a><\/noindex> JSON (ECMA-404, Rozdzia\u0142 5), mimo \u017ce s\u0105 u\u017cywane w JavaScript. Co wi\u0119cej, dla BSON zosta\u0142y one uznane za przestarza\u0142e i s\u0105 przekszta\u0142cane w <code>$null<\/code>, co nie zawsze jest dobrym rozwi\u0105zaniem. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/meteor\/meteor\/issues\/1646#issuecomment-29682964\">Unikaj u\u017cywania <i>\"undefined\"<\/i> w MongoDB<\/a><\/noindex>.<\/p>\n<h3>U\u017cycie <code>$limit()<\/code> bez <code>$sort()<\/code><\/h3>\n<p>\nBardzo cz\u0119sto, gdy rozwijasz aplikacj\u0119 w MongoDB, przydatne jest po prostu zobaczenie pr\u00f3bki wyniku, kt\u00f3ry zostanie zwr\u00f3cony z zapytania lub agregacji. Do tego zadania przyda ci si\u0119 <code>$limit()<\/code>, ale nigdy nie powinno go by\u0107 w finalnej wersji kodu, chyba \u017ce przed nim u\u017cywasz <code>$sort<\/code>. Ta mechanika jest potrzebna, poniewa\u017c w przeciwnym razie nie mo\u017cesz zagwarantowa\u0107 kolejno\u015bci wynik\u00f3w i nie b\u0119dziesz m\u00f3g\u0142 niezawodnie przegl\u0105da\u0107 danych. Na g\u00f3rze wynik\u00f3w b\u0119dziesz otrzymywa\u0142 r\u00f3\u017cne wpisy w zale\u017cno\u015bci od sortowania. Aby dzia\u0142a\u0107 niezawodnie, zapytania i agregacje musz\u0105 by\u0107 deterministyczne, to znaczy musz\u0105 zwraca\u0107 te same wyniki przy ka\u017cdym wykonaniu. Kod, w kt\u00f3rym s\u0105 <code>$limit()<\/code>, ale nie ma <code>$sort<\/code>, nie b\u0119dzie deterministyczny i w przysz\u0142o\u015bci mo\u017ce spowodowa\u0107 b\u0142\u0119dy, kt\u00f3re b\u0119d\u0105 trudne do zidentyfikowania.<\/p>\n<h3>Podsumowanie<\/h3>\n<p>\nJedynym sposobem na rozczarowanie si\u0119 MongoDB jest por\u00f3wnywanie jej bezpo\u015brednio z innym typem baz danych, takim jak RDBMS, lub przyj\u015bcie do jej u\u017cywania, opieraj\u0105c si\u0119 na jakich\u015b okre\u015blonych oczekiwaniach. To tak, jakby por\u00f3wnywa\u0107 pomara\u0144cz\u0119 z widelcem. Systemy baz danych maj\u0105 swoje cele. Najlepiej po prostu zrozumie\u0107 i doceni\u0107 te r\u00f3\u017cnice. By\u0142oby wstyd naciska\u0107 na programist\u00f3w MongoDB z powodu drogi, kt\u00f3r\u0105 zmusili ich zaj\u0105\u0107 si\u0119 RDBMS. Chcia\u0142bym widzie\u0107 nowe i interesuj\u0105ce sposoby rozwi\u0105zania starych problem\u00f3w, takich jak zapewnienie integralno\u015bci danych i tworzenie system\u00f3w danych odpornych na awarie i ataki cybernetyczne.<\/p>\n<p>Wprowadzenie w MongoDB w wersji 4.0 transakcyjno\u015bci ACID to dobry przyk\u0142ad wprowadzenia wa\u017cnych ulepsze\u0144 w spos\u00f3b innowacyjny. Transakcje wielodokumentowe i wieloopera cyjne s\u0105 teraz atomowe. Pojawi\u0142a si\u0119 r\u00f3wnie\u017c mo\u017cliwo\u015b\u0107 regulacji czasu potrzebnego na uzyskanie blokad oraz ko\u0144czenia zawieszonych transakcji, a tak\u017ce zmiany poziomu izolacji.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/ZRL1\/\"><img decoding=\"async\" alt=\"14 rzeczy, kt\u00f3re chcia\u0142bym wiedzie\u0107 przed rozpocz\u0119ciem pracy z MongoDB\" src=\"\/wp-content\/uploads\/2020\/09\/9966ff2613efab52aac99c2a0eda5c87.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<h3>Czytaj dalej:<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/519340\/\">Jak za\u0142adowa\u0107 dane do Google BigQuery<\/a><\/noindex><\/li>\n<\/ul>\n<p>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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 rzeczy, kt\u00f3re chcia\u0142bym wiedzie\u0107 przed rozpocz\u0119ciem pracy z MongoDB | ProHoster","description":"T\u0142umaczenie artyku\u0142u zosta\u0142o przygotowane przed rozpocz\u0119ciem kursu \u00abBazy danych nierelacyjne\u00bb.","canonical_url":"https:\/\/prohoster.info\/pl\/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":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/95148","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=95148"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/95148\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/95149"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=95148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=95148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=95148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}