Natrafiając na to i rozsądnie rozumiejąc, jak działają migracje w relacyjnej bazie danych, MongoDB nieco to upraszcza. Doszedłem do 2 sposobów, aby to rozbić. Kwestie, które należy wziąć pod uwagę, mając do czynienia z migracjami danych w MongoDB (nie wszystkie tak rzadko spotykane w przypadku baz danych RDB):
- Zapewnienie, że lokalne środowiska testowe nie psują się, gdy programista łączy najnowsze z repozytorium projektu
- Zapewnienie, że wszelkie dane są poprawnie aktualizowane w aktualnej wersji, niezależnie od tego, czy użytkownik jest zalogowany, czy wylogowany, jeśli używane jest uwierzytelnianie. (Oczywiście, jeśli wszyscy zostaną automatycznie wylogowani po dokonaniu aktualizacji, martw się tylko o to, kiedy użytkownik się zaloguje).
1) Jeśli Twoja zmiana spowoduje wylogowanie wszystkich lub spodziewany jest przestój aplikacji, prostym sposobem na to jest posiadanie skryptu migracji, aby połączyć się z lokalną lub działającą bazą danych MongoDB i zaktualizować prawidłowe dane. Przykład, w którym nazwa użytkownika jest zmieniana z pojedynczego ciągu znaków na obiekt o podanej nazwie i nazwisku (oczywiście bardzo podstawowe i musiałoby zostać umieszczone w skrypcie, aby uruchomić go dla wszystkich programistów):
Korzystanie z CLI:
mongod
use myDatabase
db.myUsers.find().forEach( function(user){
var curName = user.name.split(' '); //need some more checks..
user.name = {given: curName[0], family: curName[1]};
db.myUsers.save( user );
})
2) Chcesz, aby aplikacja przeprowadzała migrację schematów w górę iw dół na podstawie uruchomionej wersji aplikacji. Będzie to oczywiście mniejsze obciążenie dla działającego serwera i nie będzie wymagało przestojów ze względu na aktualizowanie użytkowników tylko wtedy, gdy po raz pierwszy używają zaktualizowanych/obniżonych wersji.
Jeśli używasz oprogramowania pośredniego w Expressjs dla Nodejs:
- Ustaw zmienną aplikacji w skrypcie aplikacji głównej za pomocą
app.set('schemaVersion', 1)
który będzie później używany do porównania z wersją schematu użytkownika. - Teraz upewnij się, że wszystkie schematy użytkownika mają również właściwość schemaVersion, abyśmy mogli wykryć zmianę między wersją schematu aplikacji a bieżącymi schematami MongoDB tylko dla TEGO OKREŚLONEGO UŻYTKOWNIKA.
-
Następnie musimy stworzyć proste oprogramowanie pośrednie do wykrywania konfiguracji i wersji użytkownika
app.use( function( req, res, next ){ //If were not on an authenticated route if( ! req.user ){ next(); return; } //retrieving the user info will be server dependent if( req.user.schemaVersion === app.get('schemaVersion')){ next(); return; } //handle upgrade if user version is less than app version //handle downgrade if user version is greater than app version //save the user version to your session / auth token / MongoDB where necessary })
Dla upgrade/downgrade zrobiłbym proste pliki js w katalogu migrations z funkcjami eksportu upgrade/downgrade, które zaakceptują model użytkownika i uruchomią zmiany migracji na tym konkretnym użytkowniku w MongoDB. Na koniec upewnij się, że wersja użytkownika jest zaktualizowana w MongoDB, aby nie uruchamiali zmian ponownie, chyba że ponownie przejdą do innej wersji.