25

Mongoid를 사용하여 레일스에서 ​​DB 마이그레이션을 수행하는 방법에 대한 간단한 소개를받을 수 있습니까? 필자는 문서 마이그레이션 당 게으른 관심이 특히 큽니다. 이것은 데이터베이스에서 문서를 읽을 때마다 최신 버전으로 마이그레이션하고 다시 저장한다는 의미입니다.몽고이드 마이그레이션 관리

이전에 이런 일을 한 사람이 있습니까? 나는 mongoid_rails_migrations을 보았지만 어떤 종류의 문서도 제공하지는 않습니다.하지만이 방법을 사용하는 것처럼 보이지만 실제로 사용하는 방법은 잘 모르겠습니다.

내가 ActiveRecord 마이그레이션에만 개념적으로 익숙하다는 것을 지적해야합니다.

+0

감사하겠습니다 https://github.com/nviennot/mongoid_lazy_migration

: 여기

내가 생각 해낸 것입니다. 차라리 거대한 데이터 업데이트를 실행하고, 완료 될 때까지 기다리고, 모니터하고, 문제가 생겼을 때 되돌릴 방법을 생각하고, 데이터베이스 복제본에서 먼저 테스트하십시오. 시간이 오래 걸리지 만 데이터 불일치가 발생하지는 않습니다. –

답변

21

전체 마이그레이션을 즉시 수행하려면 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_namelast_name 필드를 포함하는 것을 잊었 기 때문에 마이그레이션이 실패합니다.

7

Zachary Anker는 그의 답변에서 많은 것을 설명했습니다. mongoid_rails_migrations를 사용하는 것이 마이그레이션에 좋은 옵션입니다. 여기

은 통과 한 후 이것을 Readme이 예제에 충분해야입니다 것은 구현하는 mongoid_rails_migrations

Mongoid Migrations using the Mongo Driver

Embedding Mongoid documents and data migrations

기타를 사용하는 것이 유용 할 것이다 예를 몇 가지 링크입니다 몽고 이민

3

나는 같은 필요를 가지고있다. 나는 기꺼이 내가 게으른 마이그레이션이 좋은 아이디어라고 생각하지 않는 일부 피드백

+0

이것은 정확하게 옳은 것, 굉장한 것처럼 보인다! –