MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como lidar adequadamente com as migrações de esquema do mangusto?


Ao se deparar com isso e entender razoavelmente como as migrações funcionam em um banco de dados relacional, o MongoDB torna isso um pouco mais simples. Eu vim para 2 maneiras de quebrar isso. As coisas a serem consideradas ao lidar com migrações de dados no MongoDB (não tão incomuns em RDBs) são:
  • Garantir que os ambientes de teste locais não sejam interrompidos quando um desenvolvedor mescla o mais recente do repositório do projeto
  • Garantir que todos os dados sejam atualizados corretamente na versão ativa, independentemente de um usuário estar conectado ou desconectado se a autenticação for usada. (É claro que, se todos forem desconectados automaticamente quando uma atualização for feita, será necessário se preocupar apenas quando um usuário fizer login).

1) Se a sua alteração desconectar todos ou o tempo de inatividade do aplicativo for esperado, a maneira mais simples de fazer isso é ter um script de migração para conectar-se ao MongoDB local ou ativo e atualizar os dados corretos. Exemplo em que o nome de um usuário é alterado de uma única string para um objeto com nome de família (muito básico, é claro, e precisaria ser colocado em um script para ser executado para todos os desenvolvedores):

Usando a 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) Você deseja que o aplicativo migre os esquemas para cima e para baixo com base na versão do aplicativo em execução. Obviamente, isso será um fardo menor para um servidor ativo e não exigirá tempo de inatividade devido à atualização apenas dos usuários quando eles usarem as versões atualizadas / rebaixadas pela primeira vez.

Se você estiver usando middleware no Expressjs para Nodejs:
  • Defina uma variável de aplicativo no script do aplicativo raiz por meio de app.set('schemaVersion', 1) que será usado posteriormente para comparar com a versão do esquema do usuário.
  • Agora, certifique-se de que todos os esquemas de usuário também tenham uma propriedade schemaVersion para que possamos detectar uma alteração entre a versão do esquema do aplicativo e os esquemas atuais do MongoDB apenas para esse usuário em particular.

  • Em seguida, precisamos criar um middleware simples para detectar a configuração e a versão do usuário
    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
    })
    

Para o upgrade / downgrade, eu faria arquivos js simples em um diretório de migrações com funções de exportação de upgrade / downgrade que aceitariam o modelo de usuário e executariam as alterações de migração nesse usuário específico no MongoDB. Por fim, certifique-se de que a versão dos usuários esteja atualizada no seu MongoDB para que eles não executem as alterações novamente, a menos que mudem para uma versão diferente novamente.