2009-11-19 9 views
22

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

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

Más tarde, en la versión 2, me doy cuenta de que necesito un duplicado de la llave requerida en el modelo. Así, 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 migrar todos mis datos existentes para incluir some_new_key? Supongamos que sé cómo establecer un valor predeterminado razonable para todos los documentos existentes. Llevando esto un paso más allá, supongamos que en la versión 3, me doy cuenta de que realmente no necesito alguna clave. Por lo tanto, ahora el modelo se parece a esto

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 está perdiendo espacio en este punto. ¿Cómo reclamo ese espacio?

Con ActiveRecord, acabo de crear migraciones para agregar los valores iniciales de alguna_nueva_clave (en la versión1 -> migración de la versión 2) y eliminar los valores para some_key (en la versión2 -> migración de la versió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 sentido de mi pregunta. Hay momentos en los que desea poder ejecutar un script en una base de datos para cambiar o reestructurar los datos en él. Di dos ejemplos más arriba, uno en el que se agregó una nueva clave obligatoria y otra en la que se puede eliminar una clave y reclamar espacio. ¿Cómo se gestiona la ejecución de estos scripts? Las migraciones de ActiveRecord le brindan una manera fácil de ejecutar estos scripts y determinar qué scripts ya se han ejecutado y qué scripts no se han ejecutado. Obviamente, puedo escribir una secuencia de comandos de Mongo que haga alguna actualización en la base de datos, pero lo que estoy buscando es un marco como migraciones que me permita rastrear qué secuencias de comandos de actualización ya se han ejecutado.

+0

Creo que Mongo (/ Mapper) podría ser demasiado joven para ese tipo de cosas. :/ – Konklone

+0

La migración en términos de esquema en realidad no es un concepto adecuado en Mongo DB ya que Mongo DB en realidad no tiene ningún esquema. Solo necesita escribir el script de migración de datos usted mismo. – zsong

Respuesta

13

Echa un vistazo a Mongrations ... Acabo de terminar de leer al respecto y parece lo que buscas.

http://terrbear.org/?p=249

http://github.com/terrbear/mongrations

Saludos! Kapslok

+1

Para Rails 3, echa un vistazo a esta horquilla de las mongraciones de terrbear: https://github.com/TheHiveProjects/mongrations. (Al momento de escribir esto, esa es la bifurcación con los commits más recientes). Tuve que especificar 'gem' mongrations ',: git =>' git: // github.com/TheHiveProjects/mongrations.git'' para obtenerlo trabajar. – colllin

-5

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

MongoMapper intenta imponer algunas restricciones sobre esto, pero dado que la base de datos es tan flexible, tendrá que 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 a medida que los encuentre.

Soy bastante nuevo en MongoDB, pero por lo que puedo ver, debido a la flexibilidad del DB sin esquema, así es como tendrá que manejarlo.

+9

No estoy de acuerdo con este argumento: "MongoDB es una base de datos sin esquema. Es por eso que no hay migraciones". Aunque MongoDB no impone un esquema en sus documentos, en la práctica es probable que desee que su aplicación aplique un esquema, hasta cierto punto. Si define "migración" un poco más ampliamente, es fácil ver cómo una aplicación web respaldada por MongoDB podría necesitar migraciones. Es cierto que un tipo de migración es una migración de esquema "formal".Pero hay otros tipos de migraciones que siguen siendo muy importantes: agregar claves, renombrar claves, cambiar datos, etc. –

+11

Las transformaciones de datos son migraciones. MongoDB tiene datos. –

1

Una opción es utilizar la operación update 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.

-1

Apuesto a que puedes conectar con Activerecord :: Miration para automatizar y rastrear tus scripts de "migración".

0

Clint,

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

En tal caso, hice lo siguiente y lo dirige 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 
------------------------------ 
1

Acabamos de construir éste: https://github.com/eberhara/mongration - es un módulo de nodo normal (que se puede encontrar en npm).

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

Tiene mucho de la de mejores características que los marcos de migración regular:

  • suma de comprobación (emite un error cuando un previosuly corrieron la migración no coincide con la versión antigua)
  • Persiste estado de la migración a mongo (hay sin archivo de estado regular)
  • soporte completo a réplica establece
  • reversiones mango automáticos (los desarrolladores deben especificar los procedimientos de reversión)
  • capacidad de ejecutar multípara Le (migraciones de sincronización o asíncrono) al mismo tiempo
  • Capacidad para ejecutar las migraciones contra diferentes bases de datos al mismo tiempo

espero que ayude!

Cuestiones relacionadas