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.