MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak prawidłowo obsłużyć migracje schematów mongusty?

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Dane wiosenne MongoDb:MappingMongoConverter usuń _class

  2. Zmień typ pola w agregacji mongoDB i czy $lookup używa indeksu na polach, czy nie?

  3. MongoDB – przynieś własne certyfikaty SSL

  4. Wydajność MongoDB:uruchamianie agregacji MongoDB na serwerach pomocniczych

  5. mongodb przenosi dokumenty z jednej kolekcji do innej kolekcji