전체 마이그레이션을 즉시 수행하려면 mongoid_rails_migrations가 필요한 것을 수행합니다. 실제로 문서화하는 것이별로 없으며 표준 ActiveRecord 마이그레이션 기능을 복제합니다. 마이그레이션을 작성한 다음 rake db:migrate
을 사용하여 마이그레이션을 적용하고 실행 된 마이그레이션과 실행되지 않은 마이그레이션을 처리합니다. 당신이 그것에 대해 알고 싶은 특정한 것이 있으면 나는 더 이상의 질문에 답할 수있다.
지연 마이그레이션의 경우 가장 쉬운 방법은 after_initialize 콜백을 사용하는 것입니다. 필드는 이전 데이터 방식과 일치하는지 확인하고이하는 경우 예를 들어, 그래서 당신은 그것을 그에게 개체를 수정하고 업데이트 :
class Person
include Mongoid::Document
after_initialize :migrate_data
field :name, :type => String
def migrate_data
if !self[:first_name].blank? or !self[:last_name].blank?
self.set(:name, "#{self[:first_name]} #{self[:last_name]}".strip)
self.remove_attribute(:first_name)
self.remove_attribute(:last_name)
end
end
end
장단점은 내가 위에서 준 특정 접근 방식을 염두에두고 :
많은 레코드를 반환하는 요청 (예 : Person.all.each {|p| puts p.name}
)을 실행하고 100 명이 이전 형식 인 경우 즉시 100 개의 쿼리가 실행됩니다. 대신 self.name = "#{self.first_name} #{self.last_name}".strip
으로 전화 할 수도 있지만 레코드를 저장 한 경우에만 데이터가 마이그레이션됩니다.
일반적인 문제는 Person.where(:name => /Foo/).count
과 같은 모든 대량 쿼리가 모든 데이터가 마이그레이션 될 때까지 실패한다는 것입니다. 또한 Person.only(:name).first
을 수행하면 first_name
및 last_name
필드를 포함하는 것을 잊었 기 때문에 마이그레이션이 실패합니다.
감사하겠습니다 https://github.com/nviennot/mongoid_lazy_migration
: 여기
내가 생각 해낸 것입니다. 차라리 거대한 데이터 업데이트를 실행하고, 완료 될 때까지 기다리고, 모니터하고, 문제가 생겼을 때 되돌릴 방법을 생각하고, 데이터베이스 복제본에서 먼저 테스트하십시오. 시간이 오래 걸리지 만 데이터 불일치가 발생하지는 않습니다. –