MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come gestire correttamente le migrazioni dello schema mangusta?

Imbattendosi in questo e comprendendo ragionevolmente come funzionano le migrazioni su un database relazionale, MongoDB lo rende un po' più semplice. Sono venuto a 2 modi per abbattere questo. Le cose da considerare quando si ha a che fare con le migrazioni dei dati in MongoDB (non così raro da RDB) sono:

  • Garantire che gli ambienti di test locali non si interrompano quando uno sviluppatore unisce le ultime dal repository del progetto
  • Garantire che tutti i dati siano aggiornati correttamente sulla versione live indipendentemente dal fatto che un utente sia connesso o disconnesso se viene utilizzata l'autenticazione. (Ovviamente se tutti vengono automaticamente disconnessi quando viene effettuato un aggiornamento, è necessario preoccuparsi solo dell'accesso di un utente).

1) Se la tua modifica disconnetterà tutti o sono previsti tempi di inattività dell'applicazione, il modo semplice per farlo è disporre di uno script di migrazione per connettersi a MongoDB locale o live e aggiornare i dati corretti. Esempio in cui il nome di un utente viene modificato da una singola stringa a un oggetto con nome e cognome (ovviamente molto semplice e dovrebbe essere inserito in uno script per essere eseguito per tutti gli sviluppatori):

Utilizzando l'interfaccia a riga di comando:

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) Si desidera che l'applicazione migri gli schemi su e giù in base alla versione dell'applicazione in esecuzione. Questo sarà ovviamente meno oneroso per un server live e non richiederà tempi di inattività a causa dell'aggiornamento degli utenti solo quando utilizzano le versioni aggiornate/declassate per la prima volta.

Se utilizzi il middleware in Expressjs per Nodejs:

  • Imposta una variabile dell'app nello script dell'app root tramite app.set('schemaVersion', 1) che verrà utilizzato in seguito per il confronto con la versione dello schema degli utenti.
  • Ora assicurati che tutti gli schemi utente abbiano anche una proprietà schemaVersion in modo da poter rilevare una modifica tra la versione dello schema dell'applicazione e gli schemi MongoDB correnti solo per QUEL PARTICOLARE UTENTE.
  • Successivamente dobbiamo creare un middleware semplice per rilevare la configurazione e la versione utente

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

Per l'aggiornamento / downgrade, creerei semplici file js in una directory di migrazioni con funzioni di esportazione di aggiornamento / downgrade che accetteranno il modello utente ed eseguiranno le modifiche alla migrazione su quel particolare utente nel MongoDB. Infine, assicurati che la versione degli utenti sia aggiornata nel tuo MongoDB in modo che non eseguano nuovamente le modifiche a meno che non passino nuovamente a una versione diversa.