sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo manejar adecuadamente las migraciones de esquema de mongoose?

Al encontrar esto y comprender razonablemente cómo funcionan las migraciones en una base de datos relacional, MongoDB lo simplifica un poco. He llegado a 2 formas de desglosar esto. Las cosas a considerar cuando se trata de migraciones de datos en MongoDB (que no son tan poco comunes en RDB) son:

  • Garantizar que los entornos de prueba locales no se rompan cuando un desarrollador combine lo último del repositorio del proyecto
  • Asegurarse de que todos los datos se actualicen correctamente en la versión en vivo, independientemente de si un usuario inició sesión o no, si se usa la autenticación. (Por supuesto, si todos se desconectan automáticamente cuando se realiza una actualización, entonces solo es necesario preocuparse por cuándo un usuario inicia sesión).

1) Si su cambio cerrará la sesión de todos o se espera un tiempo de inactividad de la aplicación, la forma más sencilla de hacerlo es tener un script de migración para conectarse a MongoDB local o en vivo y actualizar los datos correctos. Ejemplo en el que el nombre de un usuario se cambia de una sola cadena a un objeto con un nombre dado y familiar (muy básico, por supuesto, y debería incluirse en un script para que se ejecute para todos los desarrolladores):

Usando la 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) Desea que la aplicación migre los esquemas hacia arriba y hacia abajo en función de la versión de la aplicación que se esté ejecutando. Obviamente, esto será una carga menor para un servidor en vivo y no requerirá tiempo de inactividad debido a que los usuarios solo actualizarán cuando usen las versiones actualizadas / degradadas por primera vez.

Si usa middleware en Expressjs para Nodejs:

  • Establezca una variable de aplicación en la secuencia de comandos de su aplicación raíz a través de app.set('schemaVersion', 1) que se usará más adelante para comparar con la versión del esquema de los usuarios.
  • Ahora asegúrese de que todos los esquemas de usuario también tengan una propiedad schemaVersion para que podamos detectar un cambio entre la versión del esquema de la aplicación y los esquemas actuales de MongoDB solo para ESE USUARIO EN PARTICULAR.
  • A continuación, debemos crear un middleware simple para detectar la configuración y la versión del usuario

    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 la actualización / degradación, crearía archivos js simples en un directorio de migraciones con funciones de exportación de actualización / degradación que aceptarán el modelo de usuario y ejecutarán los cambios de migración en ese usuario en particular en MongoDB. Por último, asegúrese de que la versión de los usuarios esté actualizada en su MongoDB para que no vuelvan a ejecutar los cambios a menos que vuelvan a cambiar a una versión diferente.