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.