2012-02-17 10 views
13

Wystarczy podać nieco więcej kontekstu na pytanie, mam aplikację internetową (asp mvc), która zasadniczo opakowuje operacje CRUD do instancji MongoDb, przeprowadza walidację i pewną logikę biznesową, zanim model zostanie zweryfikowany i wysłany do przechowywania, odzyskania itp.Obsługa migracji z MongoDb

Teraz mamy jeden problem, że w nowej wersji modele się zmieniły, ale istniejące dane nie, oto przykład: (jest to C# specyficzne, ale pytanie naprawdę jest agnostyczny)

public class Person 
{ 
    public Guid Id {get; set;} 
    public string Name {get; set;} 
    public int Age {get;set;} 
    public string BadgeNo {get;set;} 
} 

public class Person 
{ 
    public Guid Id {get; set;} 
    public string Name {get; set;} 
    public int Age {get;set;} 
    public string EmployeeNo {get; set;} // Still contains same data as BadgeNo just called something different 
} 

Jak widać struktura obiektów uległa zmianie, ale w kraju Mongo t nadal przekazuje BadgeNo, a nie EmployeeNo. W środowisku SQL zwykle mamy skrypt migracji uruchamiany jako część skryptu budowania, który zmieniałby schemat i aktualizował/wstawiał/usuwał wszelkie dodatkowe dane dla tej delty.

Więc jak najlepiej zarządzać tego rodzaju migracji z Mongo? Czy powinienem mieć również skrypt, którego używam do aktualizowania wszystkich instancji w Mongo? czy jest jakaś inna preferowana praktyka do robienia tego rodzaju rzeczy.

Wszelkie porady na ten temat byłoby świetnie

=== Edit ===

Wydaje się, że obecnie jestem chcąc iść z możliwością migracji zamiast podejścia stopniowego wycofywania, więc z tego Każdy może polecić jakiekolwiek narzędzia pomagające w tej dziedzinie, ponieważ w przeciwnym wypadku każda migracja (zakładając roll-in, roll-out) musiałaby być wcześniej skompilowanym zbiorem z całą logiką. Myślałem o czymś linie FluentMigrator, ale zamiast pracy z SQL pracujesz z Mongo. Obecnie moje skrypty kompilacji używają Nant, widziałem kilka narzędzi ruby, ale nie jestem pewien, czy istnieje jakiś odpowiednik .net.

Odpowiedz

14

Istnieją zasadniczo dwa podejścia:

  1. upewnić się, że kod aplikacji może obsługiwać obie „wersje” struktury danych, a podczas zapisywania, aktualizacji do nowej struktury
  2. Napisz scenariusz migracji

Prawdopodobnie wybrałbym opcję 1, ponieważ jest to metoda pozwalająca na stopniową aktualizację, ponieważ tak jak w przypadku opcji 2, zasadniczo konieczne jest usunięcie aplikacji, aby można było zaktualizować kod (szybko) i dane (ewentualnie wolniej) za jednym razem.

Następnie, lub jeśli okaże się to konieczne, przeprowadź również drugą opcję, aby przenieść swoje dane. To nie musi więc likwidować twojej witryny i może z przyjemnością działać asynchronicznie w tle.

+1

Wybrałabym opcję 1 - a następnie użyłabym tego kodu, aby utworzyć narzędzie migracji (na przykład z poziomu wiersza poleceń), które później wykonuje równoważnik opcji 2, ładując i zapisując wszystkie dokumenty z kolekcji, które wciąż znajdują się w stara wersja. –

+0

Dobry pomysł Sean, zaktualizowałem swoją odpowiedź. – Derick

+2

Problem polega na tym, że piszesz ALOT z nadmiarem kodu, który będziesz musiał utrzymywać, aby obsługiwać tylko wiele wersji, i wyobrażasz sobie 20 wersji z rzędu, że masz 20 plików dla każdego modelu, który się zmienił. Dla mnie 2 opcje wydają się lepsze, ponieważ łatwiej jest je przenosić między wersjami (tj. Wycofywanie zmian), nie mam problemu z niewielkimi przestojami. Dzięki za odpowiedź pozostawi to nieco dłużej, ponieważ oczekiwałem, że wiele osób powie Opcję 2, ale liczyło na trochę więcej informacji na temat tego, jak najlepiej zautomatyzować drugie podejście, czyli w ramach skryptu budującego. – Grofit

3

Strategie mogą być różne. I zależą od konkretnego zastosowania. Na pewno w przypadku witryn takich jak Facebook pójdziesz z opcją # 1 zaproponowaną przez Derick, aby nie trafić użytkowników, ale jeśli masz witrynę, która jest "sprzedaje pizzę", z pewnością nie chcesz wesprzeć wsparcia obie wersje (prąd i nową), napisać bardziej skomplikowanego kodu, etc ..

dla tego rodzaju aplikacji prosty łatanie mogą być lepszym rozwiązaniem:

  1. serwer aplikacji budowy wyślij do „tryb odczytu”, tak każdy może czytać, ale nie może wstawić niczego do bazy danych.
  2. Podczas pracy w trybie do odczytu zbieram bazę danych i aplikuję poprawki.
  3. Po zakończeniu łatania wykonaj kopię bazy danych, zatrzymaj serwer WWW, wdróż nową bazę danych i nową aplikację.

Wysyłanie aplikacji do trybu odczytu pozwalają zmniejszyć czas przestojów, ale znowu do witryn, które jest „sprzedaje pizzę” nie trzeba tryb odczytu.

1

Wydaje się, że obecnie jestem chcąc iść z możliwością migracji zamiast podejścia stopniowego wycofywania, więc mając to na uwadze, może ktoś polecić jakieś narzędzia do pomocy w tej dziedzinie

Dla tych, którzy wciąż szukają rozwiązania, spójrz na MongoMigrations, to narzędzie udostępnia MongoDatabase (z mongo sterownika csharp) do manipulacji w bazie danych, dzięki czemu można korzystać ze wszystkich funkcji sterownika.