Tłumaczenie artykułu zostało przygotowane w przeddzień rozpoczęcia kursu
Highlights:
- Opracowanie schematu jest niezwykle ważne, mimo że w MongoDB jest to opcjonalne.
- Podobnie indeksy muszą być zgodne ze schematem i wzorcami dostępu.
- Unikaj używania dużych obiektów i dużych tablic.
- Zachowaj ostrożność przy ustawieniach MongoDB, zwłaszcza jeśli chodzi o bezpieczeństwo i niezawodność.
- MongoDB nie posiada optymalizatora zapytań, dlatego należy zachować ostrożność podczas wykonywania operacji na zapytaniach.
Pracuję z bazami danych od bardzo długiego czasu, ale dopiero niedawno odkryłem MongoDB. Jest kilka rzeczy, które chciałbym wiedzieć, zanim zacząłem z tym pracować. Jeśli dana osoba ma już doświadczenie w określonej dziedzinie, ma z góry przyjęte wyobrażenie o tym, czym są bazy danych i do czego służą. W nadziei, że ułatwię innym zrozumienie, przedstawiam listę typowych błędów.
Tworzenie serwera MongoDB bez uwierzytelniania
Niestety MongoDB jest domyślnie instalowany bez uwierzytelniania. W przypadku stacji roboczej dostępnej lokalnie jest to normalne zjawisko. Ponieważ jednak MongoDB to system dla wielu użytkowników, który lubi wykorzystywać duże ilości pamięci, lepiej będzie, jeśli umieścisz go na serwerze z jak największą ilością pamięci RAM, nawet jeśli będziesz go używać tylko do programowania. Instalacja na serwerze poprzez domyślny port może być problematyczna, szczególnie jeśli w żądaniu można wykonać dowolny kod JavaScript (np. $where
jako pomysł na
Istnieje kilka metod uwierzytelniania, ale najłatwiejszym jest ustawienie identyfikatora użytkownika/hasła. Skorzystaj z tego pomysłu, myśląc o wymyślnym uwierzytelnianiu opartym na
Nie zapomnij powiązać powierzchni ataku z MongoDB
,
lub
. Ponieważ pliki danych nie są szyfrowane w standardowej MongoDB, sensowne jest uruchomienie MongoDB
Błąd podczas opracowywania obwodu
MongoDB nie używa schematu. Ale to nie znaczy, że program nie jest potrzebny. Jeśli chcesz po prostu przechowywać dokumenty bez spójnego schematu, przechowywanie ich może być szybkie i łatwe, ale późniejsze ich odzyskanie może być trudne.
Klasyczny artykuł”
Nie zapomnij o kolejności sortowania
Zapomnienie o kolejności sortowania może spowodować więcej frustracji i zmarnować więcej czasu niż jakakolwiek inna nieprawidłowa konfiguracja. Domyślnie używa MongoBD
Twórz kolekcje z dużymi dokumentami
MongoDB z przyjemnością hostuje duże dokumenty do 16 MB w kolekcjach i
Tworzenie dokumentów z dużymi tablicami
Dokumenty mogą zawierać tablice. Najlepiej, jeśli liczba elementów w tablicy jest odległa od liczby czterocyfrowej. Jeśli elementy są często dodawane do tablicy, przerośnie ona zawierający ją dokument i będzie konieczne
MongoDB ma coś, co nazywa się
Możesz pomyśleć, że możesz obejść się bez indeksowania tablic. Niestety brak indeksów może spowodować inne problemy. Ponieważ dokumenty są skanowane od początku do końca, wyszukiwanie elementów na końcu tablicy będzie trwało dłużej, a większość operacji związanych z takim dokumentem będzie
Nie zapominaj, że kolejność etapów w agregacji ma znaczenie
W systemie baz danych wyposażonym w optymalizator zapytań zapytania, które piszesz, wyjaśniają, co chcesz uzyskać, a nie jak to uzyskać. Mechanizm ten działa analogicznie do składania zamówienia w restauracji: zazwyczaj po prostu zamawiasz danie i nie dajesz kucharzowi szczegółowych instrukcji.
W MongoDB instruujesz kucharza. Na przykład musisz upewnić się, że dane przechodzą reduce
tak wcześnie, jak to możliwe, w rurociągu za pomocą $match
и $project
, a sortowanie następuje dopiero po reduce
i że wyszukiwanie odbywa się dokładnie w żądanej kolejności. Posiadanie optymalizatora zapytań, który eliminuje niepotrzebną pracę, optymalnie porządkuje kroki i wybiera typy złączeń, może Cię zepsuć. Dzięki MongoDB masz większą kontrolę kosztem wygody.
Narzędzia takie jak
Korzystanie z szybkiego nagrywania
Nigdy nie ustawiaj opcji zapisu MongoDB na dużą prędkość, ale niską niezawodność. Ten tryb „zapisz i zapomnij” wydaje się szybkie, ponieważ polecenie jest zwracane przed wystąpieniem zapisu. Jeśli system ulegnie awarii przed zapisaniem danych na dysk, zostaną one utracone i staną się niespójne. Na szczęście 64-bitowa MongoDB ma włączone rejestrowanie.
Aby temu zapobiec, silniki pamięci masowej MMAPv1 i WiredTiger korzystają z rejestrowania, chociaż WiredTiger może odzyskać dane do ostatniego spójnego stanu.
Kronikowanie zapewnia spójny stan bazy danych po odzyskaniu i zachowanie wszystkich danych do czasu zapisania ich w dzienniku. Częstotliwość nagrań konfiguruje się za pomocą parametru
.
Aby mieć pewność co do wpisów, upewnij się, że w pliku konfiguracyjnym jest włączone rejestrowanie
, a częstotliwość nagrań odpowiada ilości informacji, na jaką utratę możesz sobie pozwolić.
Sortowanie bez indeksu
Podczas wyszukiwania i agregowania danych często zachodzi potrzeba sortowania danych. Miejmy nadzieję, że zostanie to zrobione na jednym z końcowych etapów, po przefiltrowaniu wyniku w celu zmniejszenia ilości sortowanych danych. I nawet w tym przypadku będziesz potrzebować do sortowania
Jeśli nie ma odpowiedniego indeksu, MongoDB obejdzie się bez niego. Całkowity rozmiar wszystkich dokumentów w formacie wynosi 32 MB
Szukaj bez obsługi indeksu
Zapytania wyszukiwania pełnią funkcję podobną do operacji JOIN w języku SQL. Aby działać najlepiej, potrzebują indeksu wartości klucza użytego jako klucz obcy. Nie jest to oczywiste, ponieważ użycie nie jest odzwierciedlone w explain()
. Indeksy takie są dodatkiem do indeksu zapisanego explain()
, z którego z kolei korzystają operatorzy rurociągów $match
и $sort
, gdy spotykają się na początku rurociągu. Indeksy mogą teraz obejmować dowolny etap
Rezygnacja z korzystania z wielu aktualizacji
metoda
służy do zmiany części istniejącego dokumentu lub całego dokumentu, aż do całkowitej wymiany, w zależności od określonego przez Ciebie parametru
. Nie jest tak oczywiste, że nie przetworzy wszystkich dokumentów w kolekcji, chyba że ustawisz tę opcję
zaktualizować wszystkie dokumenty spełniające kryteria żądania.
Nie zapomnij o znaczeniu kolejności kluczy w tabeli skrótów
W formacie JSON obiekt składa się z nieuporządkowanej kolekcji o rozmiarze zero lub większej liczbie par nazwa/wartość, gdzie nazwa jest ciągiem znaków, a wartość jest ciągiem znaków, liczbą, wartością logiczną, wartością null, obiektem lub tablicą.
Niestety BSON przy wyszukiwaniu kładzie duży nacisk na porządek. W MongoDB kolejność kluczy w obiektach wbudowanych { firstname: "Phil", surname: "factor" }
- to nie to samo co { { surname: "factor", firstname: "Phil" }
. Oznacza to, że musisz zachować kolejność par nazwa/wartość w swoich dokumentach, jeśli chcesz mieć pewność, że je znajdziesz.
Nie myl "Zero" и "nieokreślony"
Wartość "nieokreślony" zgodnie z. nigdy nie był ważny w JSON $null
, co nie zawsze jest dobrym rozwiązaniem.
Używać $limit()
без $sort()
Dość często, gdy programujesz w MongoDB, przydatne jest zobaczenie próbki wyniku, który zostanie zwrócony z zapytania lub agregacji. Do tego zadania będziesz potrzebować $limit()
, ale nigdy nie powinien znajdować się w ostatecznym kodzie, chyba że użyjesz go wcześniej $sort
. Ta mechanika jest konieczna, ponieważ w przeciwnym razie nie można zagwarantować kolejności wyników i nie będzie można wiarygodnie przeglądać danych. Na górze wyniku zobaczysz różne wpisy w zależności od sortowania. Aby zapytania i agregacje działały niezawodnie, muszą być deterministyczne, to znaczy dawać te same wyniki przy każdym wykonaniu. Kod zawierający $limit()
, ale nie $sort
, nie będzie deterministyczny i może w konsekwencji spowodować błędy trudne do wyśledzenia.
wniosek
Jedynym sposobem, aby rozczarować się MongoDB, jest bezpośrednie porównanie jej z innym typem bazy danych, np. DBMS, lub rozpoczęcie korzystania z niej w oparciu o pewne oczekiwania. To jakby porównać pomarańczę do widelca. Systemy baz danych służą konkretnym celom. Najlepiej po prostu samemu zrozumieć i docenić te różnice. Szkoda byłoby wywierać presję na programistów MongoDB, aby zeszli na ścieżkę DBMS. Chcę zobaczyć nowe i ciekawe sposoby rozwiązywania starych problemów, takie jak zapewnienie integralności danych i tworzenie systemów danych odpornych na awarie i złośliwe ataki.
Wprowadzenie przez MongoDB transakcyjności ACID w wersji 4.0 jest dobrym przykładem wprowadzenia ważnych ulepszeń w innowacyjny sposób. Transakcje obejmujące wiele dokumentów i wielu wyciągów są teraz niepodzielne. Istnieje także możliwość dostosowania czasu wymaganego do uzyskania blokad i zakończenia zablokowanych transakcji, a także zmiany poziomu izolacji.
Czytaj więcej:
Źródło: www.habr.com