MongoDB

dokumentowa baza danych NoSQL

MongoDB (od ang. humongous – ogromny[1]) – otwarty, nierelacyjny system zarządzania bazą danych napisany w języku C++. Charakteryzuje się brakiem ściśle zdefiniowanej struktury obsługiwanych baz danych. Zamiast tego dane składowane są jako dokumenty w stylu JSON.

MongoDB
logo
ilustracja
Autor MongoDB Inc.
Pierwsze wydanie 2009
Aktualna wersja stabilna 7.0.5
(5 stycznia 2024) [±]
Język programowania C++
Platforma sprzętowa wieloplatformowa
Rodzaj nierelacyjna baza danych
Licencja SSPL lub komercyjna
Strona internetowa
Siedziba firmy MongoDB Inc. w Palo Alto

Historia

edytuj

Prace nad systemem rozpoczęła firma 10gen w 2007 roku. Pierwsza stabilna wersja ukazała się w lutym 2009[2].

Możliwości

edytuj
  • jednorodne wsparcie dla standardu Unicode,
  • obsługa danych w innych kodowaniach w formacie binarnym,
  • duża liczba obsługiwanych typów danych,
  • obsługa kursorów,
  • zapytania ad-hoc,
  • zapytania do zagnieżdżonych pól dokumentów,
  • indeksowanie,
  • wsparcie dla agregacji danych,
  • możliwość składowania plików w bazie,
  • architektura zaprojektowana z myślą o łatwej replikacji.

Wewnętrznym językiem do definiowania zapytań oraz funkcji agregujących jest JavaScript wykonywany bezpośrednio przez serwer MongoDB.

Użycie

edytuj

Interfejsy programistyczne pozwalające obsługiwać bazy MongoDB powstały dla wielu wiodących języków programowania, w tym dla C, C++, Javy, PHP, Perla, Pythona i Rubiego. Wśród znanych użytkowników systemu występują:

Krytyka

edytuj

Używając domyślnych ustawień bazy MongoDB są publicznie dostępne bez hasła. Prowadzi to do problemów takich jak w styczniu 2017, kiedy dziesiątki tysięcy baz zostało wyczyszczonych, a ich właściciele otrzymali żądanie okupu w zamian za ich przywrócenie. Jednak nawet po opłaceniu okupu często dane nie wracały do właścicieli, gdyż natychmiast po ich przywróceniu baza była czyszczona przez kogoś innego[7][8].

Dużo krytyki spotyka MongoDB ze względu na problemy ze spójnością danych. MongoDB używa modelu asynchronicznych zapisów i eventual consistency, co oznacza że klient otrzymuje jedynie obietnicę, że dane zostaną zapisane w przyszłości. Samo w sobie nie stanowi to problemu, jednak przez błędy implementacyjne nawet dane przyjęte do zapisu mogły zostawać potem odrzucane[9]. Ten błąd został poprawiony w wersji 3.4.0[10]. Innym znanym problemem jest niezwracanie części dokumentów przy wyszukiwaniach z użyciem indeksu. Pomijane są wtedy dokumenty, które w momencie rozpoczęcia wyszukiwania były aktualizowane[11].

MongoDB wspiera jedynie w niewielkim stopniu kodowanie UTF-8, co stanowi poważny problem w przypadku przechowywania tekstu w języku innym niż angielski[12]. Do wersji 3.3.11 włącznie do sortowania łańcuchów używana była funkcja memcmp, która nie obsługuje poprawnie danych w UTF-8 w różnych ustawieniach regionalnych.

Zobacz też

edytuj

Przypisy

edytuj
  1. FAQ, „MongoDB” [dostęp 2018-06-10] (ang.).
  2. Oficjalny blog MongoDB – marzec 2009.
  3. SYSTRAN [online], MongoDB [dostęp 2022-09-01] (ang.).
  4. How Python, TurboGears, and MongoDB are Transforming SourceForge.net. PyCon 2010, 2010-02-20. [dostęp 2011-01-22]. [zarchiwizowane z tego adresu (2011-02-11)]. (ang.).
  5. Jacqueline Mather: Building a Better Submission Form. NYTimes Open Blog, 2010-05-25. [dostęp 2015-04-16]. (ang.).
  6. Holy Large Hadron Collider, Batman!. The MongoDB NoSQL Database Blog, 2010-06-03. [dostęp 2011-01-22]. (ang.).
  7. Extortionists Wipe Thousands of Databases, Victims Who Pay Up Get Stiffed – Krebs on Security [online], krebsonsecurity.com [dostęp 2018-03-28] (ang.).
  8. Lucian Constantin, Ransomware groups have deleted over 10,000 MongoDB databases, „Computerworld” [dostęp 2018-03-28] (ang.).
  9. Jepsen: MongoDB stale reads [online], aphyr.com [dostęp 2018-03-28].
  10. Jepsen: MongoDB 3.4.0-rc3 [online], jepsen.io [dostęp 2018-03-28] (ang.).
  11. MongoDB queries don’t always return all matching documents!, „Meteor Blog”, 7 czerwca 2016 [dostęp 2018-03-28].
  12. Sort by collation. [dostęp 2014-04-06]. (ang.).

Linki zewnętrzne

edytuj