Натъквайки се на това и разумно разбирайки как работят миграциите върху релационна база данни, MongoDB прави това малко по-лесно. Стигнах до 2 начина да разбия това. Нещата, които трябва да имате предвид, когато се занимавате с миграции на данни в MongoDB (не толкова необичайно от RDBs), са:
- Уверете се, че локалните тестови среди няма да се счупят, когато разработчик обединява най-новото от хранилището на проекта
- Уверете се, че всички данни са правилно актуализирани в активната версия, независимо дали потребителят е влязъл или излязъл, ако се използва удостоверяване. (Разбира се, ако всички излизат автоматично, когато се направи надстройка, тогава е необходимо да се тревожите само кога потребителят ще влезе).
1) Ако вашата промяна ще изведе всички или се очаква престой на приложението, тогава простият начин да направите това е да имате скрипт за миграция, за да се свържете с локален или жив MongoDB и да надстроите правилните данни. Пример, при който името на потребителя се променя от единичен низ на обект с дадено и фамилно име (много основно разбира се и ще трябва да бъде поставено в скрипт, за да се изпълнява за всички разработчици):
Използване на 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) Искате приложението да мигрира схемите нагоре и надолу въз основа на версията на приложението, която изпълняват. Това очевидно ще бъде по-малко бреме за сървъра на живо и няма да изисква време за прекъсване поради само надграждане на потребителите, когато използват надстроените / понижените версии за първи път.
Ако използвате междинен софтуер в Expressjs за Nodejs:
- Задайте променлива на приложението в основния скрипт на приложението чрез
app.set('schemaVersion', 1)
който ще се използва по-късно за сравнение с версията на потребителската схема. - Сега се уверете, че всички потребителски схеми имат и свойство schemaVersion, за да можем да открием промяна между версията на схемата на приложението и текущите схеми на MongoDB само за ТОЗИ КОНКРЕТЕН ПОТРЕБИТЕЛ.
-
След това трябва да създадем прост междинен софтуер, за да открием конфигурацията и потребителската версия
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 })
За надстройката/понижаването ще направя прости js файлове в директория за миграции с функции за експортиране на надстройка/понижаване, които ще приемат потребителския модел и ще изпълняват промените в миграцията на този конкретен потребител в MongoDB. И накрая, уверете се, че версията на потребителите е актуализирана във вашия MongoDB, за да не изпълняват промените отново, освен ако не преминат отново към друга версия.