MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie geht man richtig mit Mongoose-Schemamigrationen um?

Wenn Sie darauf stoßen und einigermaßen verstehen, wie Migrationen auf einer relationalen Datenbank funktionieren, macht MongoDB dies ein wenig einfacher. Ich bin zu 2 Möglichkeiten gekommen, dies aufzuschlüsseln. Die Dinge, die beim Umgang mit Datenmigrationen in MongoDB (nicht allzu ungewöhnlich von RDBs) zu beachten sind, sind:

  • Sicherstellen, dass lokale Testumgebungen nicht beschädigt werden, wenn ein Entwickler das Neueste aus dem Projekt-Repository zusammenführt
  • Sicherstellen, dass alle Daten in der Live-Version korrekt aktualisiert werden, unabhängig davon, ob ein Benutzer an- oder abgemeldet ist, wenn Authentifizierung verwendet wird. (Wenn natürlich alle automatisch abgemeldet werden, wenn ein Upgrade durchgeführt wird, dann muss man sich nur darum kümmern, wann sich ein Benutzer anmeldet).

1) Wenn durch Ihre Änderung alle abgemeldet werden oder eine Anwendungsausfallzeit zu erwarten ist, können Sie dies ganz einfach über ein Migrationsskript tun, um eine Verbindung zu lokaler oder Live-MongoDB herzustellen und die richtigen Daten zu aktualisieren. Beispiel, wo der Name eines Benutzers von einer einzelnen Zeichenfolge in ein Objekt mit Vor- und Familiennamen geändert wird (natürlich sehr einfach und müsste in ein Skript eingefügt werden, damit es für alle Entwickler ausgeführt wird):

Verwenden der 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) Sie möchten, dass die Anwendung die Schemas basierend auf der von ihnen ausgeführten Anwendungsversion nach oben und unten migriert. Dies stellt natürlich eine geringere Belastung für einen Live-Server dar und erfordert keine Ausfallzeit, da Benutzer nur aktualisiert werden, wenn sie die aktualisierten / herabgestuften Versionen zum ersten Mal verwenden.

Wenn Sie Middleware in Expressjs für Nodejs verwenden:

  • Setzen Sie eine App-Variable in Ihrem Root-App-Skript über app.set('schemaVersion', 1) die später zum Vergleich mit der Schemaversion des Benutzers verwendet wird.
  • Stellen Sie jetzt sicher, dass alle Benutzerschemas auch eine schemaVersion-Eigenschaft haben, damit wir eine Änderung zwischen der Schemaversion der Anwendung und den aktuellen MongoDB-Schemas nur für DIESEN BESTIMMTEN BENUTZER erkennen können.
  • Als nächstes müssen wir eine einfache Middleware erstellen, um die Konfigurations- und Benutzerversion zu erkennen

    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 das Upgrade/Downgrade würde ich einfache js-Dateien unter einem Migrationsverzeichnis mit Upgrade-/Downgrade-Exportfunktionen erstellen, die das Benutzermodell akzeptieren und die Migrationsänderungen für diesen bestimmten Benutzer in der MongoDB ausführen. Stellen Sie abschließend sicher, dass die Benutzerversion in Ihrer MongoDB aktualisiert ist, damit sie die Änderungen nicht erneut ausführen, es sei denn, sie wechseln erneut zu einer anderen Version.