tutorial español mongodb mongoose

mongodb - español - ¿Cómo manejar adecuadamente las migraciones de esquema de mangosta?



mongoose tutorial español (3)

Al encontrar esto y comprender razonablemente cómo funcionan las migraciones en una base de datos relacional, MongoDB hace esto un poco más simple. He venido a 2 maneras de descomponer esto. Las cosas que se deben tener en cuenta cuando se trata de migraciones de datos en MongoDB (no tan poco frecuentes desde los RDB) son:

  • Asegurar que los entornos de prueba locales no se rompan cuando un desarrollador fusiona 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 está conectado o desconectado si se utiliza la autenticación. (Por supuesto, si todos los usuarios se desconectan automáticamente cuando se realiza una actualización, solo es necesario preocuparse cuando un usuario inicia sesión).

1) Si su cambio se desconectará 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 de familia y dado (es muy básico, por supuesto, y se debe colocar en un script para que se ejecute para todos los desarrolladores):

Usando el 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 según la versión de la aplicación que estén ejecutando. Obviamente, esto supondrá una carga menor para un servidor en vivo y no requerirá tiempo de inactividad debido a que solo se actualiza a los usuarios cuando utilizan las versiones actualizadas / mejoradas por primera vez.

Si usa middleware en Expressjs para Nodejs:

  • Establezca una variable de aplicación en el script de la aplicación raíz a través de app.set(''schemaVersion'', 1) que se usará más adelante para compararla con la versión del esquema del usuario.
  • Ahora asegúrese de que todos los esquemas de usuario tengan también 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 para ESTE USUARIO PARTICULAR.
  • Luego necesitamos 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 harí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 el MongoDB. Por último, asegúrese de que la versión de los usuarios esté actualizada en su MongoDB para que no ejecute los cambios nuevamente a menos que se muevan de nuevo a una versión diferente.

Soy completamente nuevo en MongoDB & Mongoose y parece que no puedo encontrar una respuesta sobre cómo manejar las migraciones cuando cambia un esquema.

Estoy acostumbrado a ejecutar scripts SQL de migración que alteran la estructura de la tabla y cualquier dato subyacente que deba modificarse. Esto normalmente implica el tiempo de inactividad de DB.

¿Cómo se maneja esto normalmente dentro de MongoDB / Mongoose? ¿Alguna idea de la que tenga que estar al tanto?


Hay 2 tipos de migraciones:

  • Fuera de línea: le requerirá que retire su servicio por mantenimiento, luego repita en toda la colección y realice los cambios que necesita.

  • En línea: no es necesario que retire su servicio por mantenimiento. Cuando lee el documento, verifica su versión y ejecuta una rutina de migración específica para cada versión entre la antigua y la nueva. Entonces se carga lo resultante.

No todos los servicios pueden permitirse una migración sin conexión, recomiendo el enfoque en línea.


Si está acostumbrado a migraciones de tipo SQL o migraciones similares a Rails, encontrará que mi herramienta cli migrate-mongoose la más adecuada para usted.

Le permite escribir migraciones con una función up y down y administra el estado por usted basándose en el éxito y el fracaso de sus migraciones.

También es compatible con ES6 si está utilizando la sintaxis de ES 2015.

Puede acceder a sus modelos de mangosta a través de this objeto, lo que facilita la realización de los cambios que necesita en sus modelos y esquemas.