En rencontrant cela et en comprenant raisonnablement comment les migrations fonctionnent sur une base de données relationnelle, MongoDB simplifie un peu les choses. Je suis venu à 2 façons de décomposer cela. Les éléments à prendre en compte lors de la gestion des migrations de données dans MongoDB (ce qui n'est pas si rare dans les RDB) sont :
- S'assurer que les environnements de test locaux ne s'interrompent pas lorsqu'un développeur fusionne la dernière version du référentiel du projet
- S'assurer que toutes les données sont correctement mises à jour sur la version en direct, qu'un utilisateur soit connecté ou déconnecté si l'authentification est utilisée. (Bien sûr, si tout le monde est automatiquement déconnecté lorsqu'une mise à niveau est effectuée, il est alors nécessaire de ne se soucier que du moment où un utilisateur se connecte).
1) Si votre modification déconnecte tout le monde ou si un temps d'arrêt de l'application est prévu, le moyen le plus simple de le faire est d'avoir un script de migration pour se connecter à MongoDB local ou en direct et mettre à niveau les données correctes. Exemple où le nom d'un utilisateur est changé d'une seule chaîne à un objet avec un prénom et un nom de famille (très basique bien sûr et devrait être mis dans un script pour fonctionner pour tous les développeurs) :
Utilisation de l'interface de ligne de commande :
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) Vous souhaitez que l'application migre les schémas vers le haut et vers le bas en fonction de la version de l'application qu'ils exécutent. Cela sera évidemment moins lourd pour un serveur en direct et ne nécessitera pas de temps d'arrêt en raison de la seule mise à niveau des utilisateurs lorsqu'ils utilisent les versions mises à niveau/rétrogradées pour la première fois.
Si vous utilisez un middleware dans Expressjs pour Nodejs :
- Définissez une variable d'application dans votre script d'application racine via
app.set('schemaVersion', 1)
qui sera utilisé plus tard pour comparer à la version du schéma des utilisateurs. - Assurez-vous maintenant que tous les schémas utilisateur ont également une propriété schemaVersion afin que nous puissions détecter un changement entre la version du schéma de l'application et les schémas MongoDB actuels pour CET UTILISATEUR PARTICULIER uniquement.
-
Ensuite, nous devons créer un middleware simple pour détecter la configuration et la version utilisateur
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 })
Pour la mise à niveau/rétrogradation, je créerais des fichiers js simples dans un répertoire de migrations avec des fonctions d'exportation de mise à niveau/rétrogradation qui accepteront le modèle utilisateur et exécuteront les modifications de migration sur cet utilisateur particulier dans MongoDB. Enfin, assurez-vous que la version des utilisateurs est mise à jour dans votre MongoDB afin qu'ils n'exécutent pas à nouveau les modifications à moins qu'ils ne passent à nouveau à une version différente.