sql >> Databáze >  >> NoSQL >> MongoDB

Jak správně zvládnout migraci schématu mongoose?

Tím, že na to narazíte a přiměřeně pochopíte, jak migrace fungují na relační databázi, MongoDB to trochu zjednoduší. Přišel jsem na 2 způsoby, jak to rozebrat. Věci, které je třeba zvážit při řešení migrace dat v MongoDB (ne vše tak neobvyklé u RDB), jsou:

  • Zajištění, aby se místní testovací prostředí nerozbila, když vývojář sloučí to nejnovější z úložiště projektu
  • Zajištění správné aktualizace všech dat v živé verzi bez ohledu na to, zda je uživatel přihlášen nebo odhlášen, pokud se používá ověřování. (Samozřejmě, pokud jsou všichni při upgradu automaticky odhlášeni, pak je nutné se starat pouze o to, kdy se uživatel přihlásí).

1) Pokud vaše změna všechny odhlásí nebo se očekává výpadek aplikace, pak jednoduchým způsobem, jak toho dosáhnout, je mít migrační skript pro připojení k místní nebo živé MongoDB a upgradovat správná data. Příklad, kdy se jméno uživatele změní z jednoho řetězce na objekt s daným a rodinným jménem (samozřejmě velmi základní a bylo by nutné jej vložit do skriptu, aby se spustil pro všechny vývojáře):

Použití 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) Chcete, aby aplikace migrovala schémata nahoru a dolů na základě verze aplikace, kterou spouští. To bude zjevně menší zátěž pro živý server a nebude to vyžadovat prostoje kvůli pouze upgradujícím uživatelům, když poprvé použijí upgradované / downgradované verze.

Pokud používáte middleware v Expressjs pro Nodejs:

  • Nastavte proměnnou aplikace ve skriptu kořenové aplikace pomocí app.set('schemaVersion', 1) který bude později použit k porovnání s verzí schématu uživatelů.
  • Nyní zajistěte, aby všechna uživatelská schémata měla také vlastnost schemaVersion, abychom mohli detekovat změnu mezi verzí schématu aplikace a aktuálními schématy MongoDB pouze pro TOHOTO KONKRÉTNÍHO UŽIVATELE.
  • Dále musíme vytvořit jednoduchý middleware pro detekci konfigurace a uživatelské verze

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

Pro upgrade / downgrade bych vytvořil jednoduché soubory js v adresáři migrací s exportními funkcemi pro upgrade / downgrade, které přijmou uživatelský model a spustí změny migrace u tohoto konkrétního uživatele v MongoDB. Nakonec se ujistěte, že uživatelská verze je aktualizována ve vaší MongoDB, aby nespouštěli změny znovu, pokud znovu nepřejdou na jinou verzi.



  1. MongoDB $allElementsTrue

  2. Jak převedu vlastnost v MongoDB z textu na typ data?

  3. Redis zápis do .ssh/authorized_keys

  4. Proč MongoDB – 10 důvodů, proč se naučit MongoDB pro rok 2022