consdata.com
Blog techniczny Blog biznesowy Dział HR
EN
mongodb

Czy wiesz, jak bezprzerwowo zmienić schemat w MongoDB?

author Barbara Mitan
26 stycznia 2024

Wyobraźmy sobie konieczność wprowadzenia zmian w schemacie. Przy tradycyjnym podejściu musielibyśmy zatrzymać aplikację, dokonać migracji bazy i dopiero po jej zakończeniu uruchomić aplikację. Co jeśli nasza kolekcja jest już bardzo duża albo przerwy nie są akceptowalne? Jest też ryzyko, że nastąpi błąd przy migracji, a powrót do poprzedniej wersji w niektórych przypadkach może być dużym problemem. Co proponuje MongoDB? Schema Versioning Pattern.

Kiedy użyć?

  • kiedy nie może być przerwy w dostępie do systemu
  • kiedy aktualizacja dokumentów może zająć godziny, dni lub tygodnie
  • kiedy nie trzeba aktualizować wszystkich dokumentów do nowej wersji

Przykład

Pierwotnie zamodelowaliśmy dane kontaktowe w następujący sposób.

{
    "_id": "<ObjectId>",
    "name": "Anakin Skywalker",
    "home": "503-555-0000",
    "work": "503-555-0010",
    "mobile": "503-555-0120"
}

Minęło trochę czasu, mamy już dużo dokumentów w naszej kolekcji, ale zmieniły się wymagania i musimy przechowywać więcej danych kontaktowych, związanych z nowymi formami komunikacji. Znamy na szczęście Attribute Pattern i decydujemy się wprowadzić nie tylko nowe pola, ale i zastosować ten wzorzec - dodajemy pole contact_method.

"contact_method": [
    { "work": "503-555-0210" },
    { "mobile": "503-555-0220" },
    { "twitter": "@anakinskywalker" },
    { "skype": "AlwaysWithYou" }
]

Nie możemy sobie jednak pozwolić na przerwę w działaniu aplikacji i migrację od razu wszystkich dokumentów. Nowe dokumenty będą miały już tylko pole contact_method, a stare jeszcze dawne pola home, work, mobile. Kod aplikacji będzie więc tworzył nowe dokumenty z polem contact_method przy dodawaniu. Może też ewentualnie aktualizować stare dokumenty przy okazji update’u.

Wymaga to od nas dostosowania kodu aplikacji do dokumentów w dwóch różnych wersjach. Twórcy Mongo proponują bardzo proste rozwiązanie - dodanie dodatkowego pola schema_version w nowych dokumentach (lub zwiększenie wartości schema_version, jeśli już istnieje).

{
    "_id": "<ObjectId>",
    "schema_version": "2",
    "name": "Anakin Skywalker",
    "contact_method": [
        { "work": "503-555-0210" },
        { "mobile": "503-555-0220" },
        { "twitter": "@anakinskywalker" },
        { "skype": "AlwaysWithYou" }
    ]
}

Mamy więc dokumenty w dwóch różnych wersjach, a nasz kod musi poradzić sobie z obsługą obu wersji. Dodatkowo, wskazane jest, żeby rozróżniać wersje na podstawie wartości pola schema_version (w przeciwieństwie do wykrywania np. czy dane pole istnieje). Możemy równocześnie wykonać w tle masową aktualizację i zadecydować sami, kiedy ma się wydarzyć. W kolejnej wersji aplikacji możemy też zdecydować o pozbyciu się kodu obsługującego obydwie wersje.

Zauważmy jednak, że w skrajnym przypadku w okresie przejściowym będziemy potrzebować więcej indeksów - dotychczasowy, wspierający poprzednią wersję i nowy, wspierający nową wersję.

Osobną kwestią, o której nie można zapomnieć, jest walidacja takiego schematu. Warto pamiętać, że chociaż Mongo, jako baza NoSQL, uznawana jest za schemaless, to pozwala na walidacje schematu, np. wymagalności pól.

Podsumowanie

Plusy:

  • bezprzerwowa migracja,
  • możliwość zarządzania migracją (kiedy i jak się odbędzie).

Minusy:

  • może być konieczność utrzymywania 2 indeksów do czasu zakończenia migracji,
  • jeśli korzystamy z walidacji schematu, może wystąpić konieczność dostosowania walidacji do dwóch wersji.

Przydatne linki

  • https://www.mongodb.com/blog/post/building-with-patterns-the-schema-versioning-pattern
  • https://docs.mongodb.com/manual/core/schema-validation/
Najnowsze wpisy

  • Dostępność w PDF - dokumenty bez barier
  • Czy wiesz, że z pomocą @starting-style można animować elementy z display: none za pomocą samego CSS?
  • Czy wiesz, że w Angular 17 została wprowadzona alternatywa dla *ngSwitch?
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

newsletter

techniczny

Zapisz się

Podobne wpisy

post-image
WCAG

Dostępność w PDF - dokumenty bez barier

author
Kacper Hoffman 28 kwi 2025
post-image
angular

Czy wiesz, że z pomocą @starting-style można animować elementy z display: none za pomocą samego CSS?

author
Piotr Tatarski 7 kwi 2025
post-image
angular

Czy wiesz, że w Angular 17 została wprowadzona alternatywa dla *ngSwitch?

author
Dorian Mejer 10 mar 2025
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

Zapisz się na

newsletter

techniczny

consdata.com
  • Kontakt

    • sales@consdata.com
    • +48 61 41 51 000

  • Biuro

    • K9Office
      Krysiewicza 9/14
      61-825 Poznań
      Polska

  • Rozwiązania

    • Eximee
    • Kouncil
  • Blog Dołącz do nas
Copyright © 2024 Consdata. All rights reserved. Privacy Policy & Cookies
Chcemy używać plików cookie oraz skryptów podmiotów trzecich do polepszania funkcjonowania tej strony Zgadzam się