MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как правилно да се справяме с миграциите на схемата на mongoose?

Натъквайки се на това и разумно разбирайки как работят миграциите върху релационна база данни, 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, за да не изпълняват промените отново, освен ако не преминат отново към друга версия.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Кога трябва да използвам NoSQL база данни вместо релационна база данни? Добре ли е да използвате и двете на един и същи сайт?

  2. mongodb, реплики и грешка:{ $err :not master and slaveOk=false, code :13435 }

  3. MongoDB отделно агрегиране

  4. MongoDB $sum Оператор на конвейер за агрегиране

  5. Като се има предвид списък с идентификатори, кой е най-добрият начин да направите заявка кои идентификатори не съществуват в колекцията?