Pregunta

Estoy construyendo una aplicación Rails usando MongoDB como el 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 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? Asumo que yo sepa cómo establecer un valor por defecto razonable para todos los documentos existentes. Teniendo esto un paso más allá, supongo que en la versión 3, me di cuenta de que realmente no necesita some_key en absoluto. Por lo tanto, ahora el modelo se parece a esto

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

Sin embargo, todos los registros existentes en mi base de datos tienen valores establecidos para some_key, y es sólo desperdiciar espacio en este punto. ¿Cómo puedo reclamar ese espacio?

Con ActiveRecord, me acaba de crear migraciones para agregar los valores iniciales de some_new_key (en el version1 -> migración version2) y para eliminar los valores para some_key (en la versión 2 -> migración de versión 3).

¿Cuál es la manera apropiada de hacer esto con MongoDB / MongoMapper? Me parece que algún método de seguimiento que las migraciones han llevado a cabo sigue siendo necesaria. ¿Existe tal cosa?

EDITADO: Creo que la gente no viene al caso de mi pregunta. Hay momentos en los que desea ser capaz de ejecutar un script en una base de datos para cambiar o reestructurar los datos en ella. Di dos ejemplos anteriormente, una que se añadió una nueva clave requerida y uno donde una clave se puede quitar y el espacio se puede recuperar. ¿Cómo se gestiona la ejecución de estas secuencias de comandos? migraciones ActiveRecord darle una forma fácil de ejecutar estos guiones y guiones para determinar lo que ya han sido correr y lo que los scripts no se han ejecutado. Yo, obviamente, puede escribir un script que hace Mongo cualquier actualización de la base de datos, pero lo que estoy buscando es un marco como las migraciones que me permite localizar en cuál scripts de actualización ya se ha ejecutado.

¿Fue útil?

Solución

Confirmar Mongrations ... acabo de terminar de leer sobre él y parece que lo que está buscando.

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

http://github.com/terrbear/mongrations

Saludos! Kapslok

Otros consejos

Una opción es utilizar la operación update para actualizar todos sus datos a la vez. actualización Multi es nueva en las versiones de desarrollo por lo que tendrá que utilizar uno de ellos.

Puede probar este artilugio que acabo de hacer, pero sólo funciona con MongoId y los carriles 3 (beta 3) en el momento. http://github.com/adacosta/mongoid_rails_migrations . Que va a ser actualizado a los carriles 3 cuando salga final.

También otra joya para migraciones MongoMapper https://github.com/alexeypetrushin/mongo_mapper_ext

Mongrations es una joya muy antigua, completamente obsoleta. Yo recomiendo no usarlo.

Éxodo es un marco muy fresco para la migración Mongo, que podría ser lo que quiere:

https://github.com/ThomasAlxDmy/Exodus

Nos construimos éste: https://github.com/eberhara/mongration - es un módulo de nodo normal (que se puede encontrar en la NGP).

Necesitábamos un marco migratorio buena mongodb, pero no pudimos encontrar ninguna - por lo que hemos construido un

.

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

  • Suma de control (problemas de un error cuando un previosuly corrió la migración no coincide con la versión antigua)
  • Persiste estado de la migración a mongo (no hay ningún archivo de estado regular)
  • Soporte completo para conjuntos de réplicas
  • reversiones automáticas mango (los desarrolladores deben especificar los procedimientos de reversión)
  • capacidad de ejecutar múltiples migraciones (sync o async) al mismo tiempo
  • Capacidad para ejecutar migraciones contra bases de datos diferentes al mismo tiempo

Espero que ayude!

Clint,

Puede escribir código para hacer cambios -. Aunque parece que para la actualización de un registro basado en sus propios campos no es compatible

En este 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
------------------------------

apuesto a que podría enganchar en ActiveRecord :: Migración para automatizar y realizar un seguimiento de las secuencias de comandos "migración".

MongoDB es una base de datos sin esquema. 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 tecla:. Some_other_key en cualquier momento

MongoMapper trata de imponer algunas restricciones sobre esto, pero ya que la base de datos es tan flexible, que tendrá que mantener esas restricciones a sí mismo. Si se necesita una llave en cada objeto, asegúrese de ejecutar una secuencia de comandos para actualizar las claves de objetos preexistentes, o manejar el caso de un objeto que no tiene esa llave ya que vienen a través de ellos.

Soy bastante nuevo en MongoDB mí mismo, pero por lo que puedo ver, debido a la flexibilidad del esquema-db menos esta es la forma en que tendrá que manejar la situación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top