ruby-on-rails mongodb migration mongomapper

ruby on rails - MongoMapper y migraciones



ruby-on-rails mongodb (9)

Estoy creando una aplicación de Rails utilizando MongoDB como back-end y MongoMapper como la herramienta ORM. Supongamos que en la versión 1, defino el siguiente modelo:

class SomeModel include MongoMapper::Document key :some_key, String end

Más adelante en la versión 2, me doy cuenta de que necesito una nueva clave requerida en el modelo. Entonces, en la versión 2, SomeModel ahora se ve así:

class SomeModel include MongoMapper::Document key :some_key, String key :some_new_key, String, :required => true end

¿Cómo migro todos mis datos existentes para incluir some_new_key? Supongamos que sé cómo establecer un valor predeterminado razonable para todos los documentos existentes. Yendo un paso más allá, supongamos que en la versión 3, me doy cuenta de que realmente no necesito ninguna tecla en absoluto. Entonces, ahora el modelo se ve así.

class SomeModel include MongoMapper::Document key :some_new_key, String, :required => true end

Pero todos los registros existentes en mi base de datos tienen valores establecidos para some_key, y en este punto solo estamos perdiendo espacio. ¿Cómo reclamo ese espacio?

Con ActiveRecord, acabaría de crear migraciones para agregar los valores iniciales de some_new_key (en la versión1 -> migración de version2) y para eliminar los valores de some_key (en la versión2 -> versión de migración3).

¿Cuál es la forma adecuada de hacer esto con MongoDB / MongoMapper? Me parece que todavía es necesario algún método para rastrear qué migraciones se han ejecutado. ¿Existe tal cosa?

EDITADO: Creo que a la gente le falta el punto de mi pregunta. Hay ocasiones en las que desea poder ejecutar un script en una base de datos para cambiar o reestructurar los datos que contiene. Di los dos ejemplos anteriores, uno donde se agregó una nueva clave requerida y otro donde se puede eliminar una clave y recuperar espacio. ¿Cómo manejas la ejecución de estos scripts? Las migraciones de ActiveRecord le ofrecen una forma fácil de ejecutar estos scripts y determinar qué scripts ya se han ejecutado y qué scripts no se han ejecutado. Obviamente puedo escribir un script de Mongo que haga cualquier actualización en la base de datos, pero lo que busco es un marco como migraciones que me permita rastrear qué scripts de actualización ya se han ejecutado.


Apuesto a que podría conectarse a Activerecord :: Miration para automatizar y rastrear sus scripts de "migración".


Clint,

Puede escribir código para hacer actualizaciones, aunque parece que no se admite la actualización de un registro basado en sus propios campos.

En tal caso, hice lo siguiente y lo ejecuté contra el servidor:

------------------------------ records = Patient.all() records.each do |p| encounters = p.encounters if encounters.nil? || encounters.empty? mra = p.updated_at #puts "/tpatient...#{mra}" else mra = encounters.last.created_at #puts "/tencounter...#{mra}" end old = p.most_recent_activity p.most_recent_activity = mra p.save! puts "#{p.last_name} mra: #{old} now: #{mra}" end ------------------------------



MongoDB es una base de datos sin esquema. Por eso no hay migraciones. En la base de datos en sí, no importa si los objetos tienen la clave: some_key o key: some_other_key en cualquier momento.

MongoMapper intenta imponer algunas restricciones en esto, pero como la base de datos es tan flexible, usted deberá mantener esas restricciones usted mismo. Si necesita una clave en cada objeto, asegúrese de ejecutar una secuencia de comandos para actualizar esas claves en objetos preexistentes, o manejar el caso de un objeto que no tenga esa clave cuando los encuentre.

Yo mismo soy bastante nuevo en MongoDB, pero por lo que puedo ver, debido a la flexibilidad de la base de datos sin esquema, así es como tendrá que manejarlo.


Mongrations es una gema super antigua, completamente obsoleta. Recomiendo NO usarlo.

Exodus es un marco de migración realmente bueno para Mongo, eso podría ser lo que quieres:

https://github.com/ThomasAlxDmy/Exodus



Solo construimos este: https://github.com/eberhara/mongration - es un módulo de nodo regular (lo puede encontrar en npm).

Necesitábamos un buen marco de migración mongodb, pero no pudimos encontrar ninguno, así que construimos uno.

Tiene muchas mejores características que los marcos de migración regulares:

  • Suma de comprobación (emite un error cuando una migración ejecutada previamente no coincide con su versión anterior)
  • Persiste el estado de migración a mongo (no hay un archivo de estado regular)
  • Soporte completo para conjuntos de réplicas
  • Rollbacks automáticos de la manija (los desarrolladores deben especificar los procedimientos de rollback)
  • Posibilidad de ejecutar múltiples migraciones (sync o async) al mismo tiempo
  • Capacidad para ejecutar migraciones contra diferentes bases de datos al mismo tiempo

¡Espero eso ayude!



Una opción es usar la operación de actualización para actualizar todos sus datos a la vez. La actualización múltiple es nueva en las versiones de desarrollo, por lo que deberá usar una de ellas.