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

Hvordan håndterer man mongoose-skemamigreringer korrekt?

Ved at støde på dette og med rimelighed forstå, hvordan migrationer fungerer på en relationel database, gør MongoDB dette lidt enklere. Jeg er kommet frem til 2 måder at opdele dette på. De ting, du skal overveje, når du håndterer datamigrering i MongoDB (ikke så ualmindeligt fra RDB'er) er:

  • Sikring af lokale testmiljøer ikke går i stykker, når en udvikler flette det seneste fra projektets lager
  • Sikring af data er korrekt opdateret på liveversionen, uanset om en bruger er logget ind eller ud, hvis der bruges godkendelse. (Selvfølgelig, hvis alle automatisk logges ud, når en opgradering foretages, er det kun nødvendigt at bekymre sig om, hvornår en bruger logger ind).

1) Hvis din ændring vil logge alle ud, eller der forventes nedetid i applikationen, er den enkle måde at gøre dette på at have et migreringsscript til at oprette forbindelse til lokale eller live MongoDB og opgradere de korrekte data. Eksempel hvor en brugers navn ændres fra en enkelt streng til et objekt med givet navn og efternavn (meget grundlæggende selvfølgelig og skal indsættes i et script for at køre for alle udviklere):

Brug af 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 ønsker, at applikationen skal migrere skemaerne op og ned baseret på den applikationsversion, de kører. Dette vil naturligvis være mindre af en byrde for en live server og ikke kræve nedetid på grund af kun at opgradere brugere, når de bruger de opgraderede/nedgraderede versioner for første gang.

Hvis du bruger middleware i Expressjs for Nodejs:

  • Indstil en appvariabel i dit root-appscript via app.set('schemaVersion', 1) som vil blive brugt senere til at sammenligne med brugerens skemaversion.
  • Sørg nu for, at alle brugerskemaer også har en schemaVersion-egenskab, så vi kan registrere en ændring mellem applikationsskemaversionen og de aktuelle MongoDB-skemaer kun for DEN BESTEMTE BRUGER.
  • Dernæst skal vi oprette simpel middleware for at detektere konfigurationen og brugerversionen

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

Til opgraderingen/nedgraderingen ville jeg lave simple js-filer under et migrationsmappe med en opgradering/nedgradere eksportfunktioner, der vil acceptere brugermodellen og køre migreringsændringerne på den pågældende bruger i MongoDB. Sørg endelig for, at brugerversionen er opdateret i din MongoDB, så de ikke kører ændringerne igen, medmindre de flytter til en anden version igen.



  1. Sådan får du Skema af mongoose-database, som er defineret i en anden model

  2. java.lang.NoClassDefFoundError ved brug af MongoDB-driver

  3. Sådan summerer du værdien af ​​en nøgle på tværs af alle dokumenter i en MongoDB-samling

  4. Sådan får du det originale dokument tilbage efter sammenlægning