sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur hanterar man migrationer av mongoosescheman korrekt?

Genom att komma över detta och rimligen förstå hur migrationer fungerar på en relationsdatabas, gör MongoDB detta lite enklare. Jag har kommit fram till 2 sätt att bryta ner detta. De saker att tänka på när man hanterar datamigreringar i MongoDB (inte så ovanligt från RDB) är:

  • Se till att lokala testmiljöer inte går sönder när en utvecklare slår samman det senaste från projektförrådet
  • Se till att all data uppdateras korrekt på liveversionen oavsett om en användare är inloggad eller ut om autentisering används. (Naturligtvis om alla loggas ut automatiskt när en uppgradering görs, är det bara nödvändigt att oroa sig för när en användare loggar in).

1) Om din ändring kommer att logga ut alla eller om programstopp förväntas, är det enkla sättet att göra detta att ha ett migreringsskript för att ansluta till lokal eller live MongoDB och uppgradera rätt data. Exempel där en användares namn ändras från en enda sträng till ett objekt med förnamn och efternamn (mycket grundläggande förstås och skulle behöva läggas in i ett skript för att köras för alla utvecklare):

Använda 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) Du vill att applikationen ska migrera scheman upp och ner baserat på applikationsversionen de kör. Detta kommer uppenbarligen att vara mindre av en börda för en liveserver och inte kräva stilleståndstid på grund av att användarna endast uppgraderar när de använder de uppgraderade/nedgraderade versionerna för första gången.

Om du använder middleware i Expressjs for Nodejs:

  • Ställ in en appvariabel i ditt rotappskript via app.set('schemaVersion', 1) som kommer att användas senare för att jämföra med användarens schemaversion.
  • Se nu till att alla användarscheman också har en schemaVersion-egenskap så att vi kan upptäcka en ändring mellan applikationsschemaversionen och de nuvarande MongoDB-schemana endast för DEN SÄRSKILDA ANVÄNDAREN.
  • Därefter måste vi skapa enkel mellanprogram för att upptäcka konfigurationen och användarversionen

    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
    })
    

För uppgraderingen/nedgraderingen skulle jag göra enkla js-filer under en migreringskatalog med en uppgradering/nedgradera exportfunktioner som accepterar användarmodellen och kör migreringsändringarna på just den användaren i MongoDB. Se till sist till att användarversionen är uppdaterad i din MongoDB så att de inte kör ändringarna igen om de inte flyttar till en annan version igen.



  1. Heroku-appen kraschar efter att MongoDB uppdaterats till 3.0

  2. SpringBoot Elasticache JedisMovedDataException:FLYTTAD

  3. Revisionsloggning för MongoDB

  4. Använd en JsonConverter globalt på en klass utan attributet