2009-11-19 3 views
22

저는 MongoDB를 백 엔드로 사용하고 MongoMapper를 ORM 도구로 사용하여 레일즈 애플리케이션을 구축하고 있습니다. 버전 1에서 다음 모델을 정의한다고 가정 해 보겠습니다.몽고 맵퍼 및 마이 그 레이션

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

나중에 버전 2에서 필요한 새 키가 필요합니다. 그래서, 버전 2에서, SomeModel는 이제 다음과 같습니다

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

가 어떻게 some_new_key을 포함하는 모든 기존 데이터를 마이그레이션합니까? 모든 기존 문서에 대해 적절한 기본값을 설정하는 방법을 알고 있다고 가정합니다. 이 단계를 더 진행하면서 버전 3에서 some_key가 전혀 필요 없다는 것을 알았습니다. 그래서, 지금이 모델은 내 데이터베이스에있는 모든 기존 레코드가 some_key 설정 값이이

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

그러나처럼 보이는, 그것은 바로이 시점에서 공간을 낭비입니다. 그 공간을 어떻게 회수합니까?

ActiveRecord를 사용하면 some_new_key (version1 -> version2 이전)의 초기 값을 추가하고 some_key (version2 -> version3 이전)의 값을 삭제하는 마이그레이션을 만들었을 것입니다.

MongoDB/MongoMapper에서이 작업을 수행하는 적절한 방법은 무엇입니까? 어느 마이그레이션을 실행했는지 추적하는 몇 가지 방법이 여전히 필요하다고 생각됩니다. 그런 것이 있습니까?

EDITED : 사람들이 내 질문의 요점을 놓치고 있다고 생각합니다. 데이터를 변경 또는 재구성하기 위해 데이터베이스에서 스크립트를 실행할 수 있기를 원하는 경우가 있습니다. 위의 두 가지 예를 들었는데 하나는 새로운 필수 키가 추가 된 키이고 하나는 키를 제거하고 공간을 다시 확보 할 수있는 키입니다. 이 스크립트의 실행을 어떻게 관리합니까? ActiveRecord 마이그레이션을 사용하면 이러한 스크립트를 쉽게 실행할 수 있고 이미 실행 된 스크립트와 실행되지 않은 스크립트를 쉽게 확인할 수 있습니다. 분명히 데이터베이스에 대한 업데이트를 수행하는 Mongo 스크립트를 작성할 수는 있지만, 이미 찾고있는 업그레이드 스크립트를 추적 할 수있는 마이그레이션과 같은 프레임 워크가 필요합니다.

+0

나는 Mongo (/ Mapper)가 그런 종류의 일에 너무 어리다고 생각한다. :/ – Konklone

+0

Mongo DB에는 실제로 스키마가 없으므로 스키마 측면에서의 마이그레이션은 실제로 Mongo DB에서 적절한 개념이 아닙니다. 직접 데이터 이전 스크립트를 작성해야합니다. – zsong

답변

13

사기성을 확인해보십시오. 방금 읽은 것으로 끝났습니다.

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

http://github.com/terrbear/mongrations

건배! Kapslok

+1

레일즈 3의 경우,이 포크 웍의 포크 (https://github.com/TheHiveProjects/mongrations)를 확인하십시오. (이 글을 쓰는 시점에서 가장 최근의 커밋을 가진 포크입니다.)'gem 'mongrations'을 지정해야합니다 : git => 'git : // github.com/TheHiveProjects/mongrations.git' ' 일하다. – colllin

-5

MongoDB는 스키마가없는 데이터베이스입니다. 이것이 마이그레이션이없는 이유입니다. 데이터베이스 자체에서 객체가 some_key 또는 some_other_key 키를 가지고 있는지 여부는 중요하지 않습니다.

MongoMapper는 이에 대한 몇 가지 제한을 시행하려고 시도하지만 데이터베이스가 매우 유연하기 때문에 이러한 제한 사항을 직접 관리해야합니다. 모든 객체에 키가 필요한 경우 스크립트를 실행하여 기존 객체의 해당 키를 업데이트하거나 키가없는 객체의 대소 문자를 처리해야합니다.

저는 MongoDB에 대해 처음 보았습니다. 그러나 볼 수있는 한, 스키마가없는 db의 유연성으로 인해이를 처리 할 필요가 있습니다.

+9

"MongoDB는 스키마가없는 데이터베이스이므로 마이그레이션이 발생하지 않습니다."라는 인수를 사용합니다. MongoDB는 문서 전체에 스키마를 적용하지 않지만 실제로는 어느 정도 응용 프로그램에서 스키마를 적용해야 할 수 있습니다. "마이그레이션"을 좀 더 광범위하게 정의하면 MongoDB 기반 웹 응용 프로그램이 마이그레이션을 필요로하는 방식을 쉽게 알 수 있습니다. 한 가지 종류의 마이그레이션이 "공식적인"스키마 마이그레이션이라는 것은 사실입니다.그러나 키 추가, 키 이름 바꾸기, 데이터 변경 등 여전히 다른 중요한 마이그레이션이 있습니다. –

+11

데이터 변환은 마이그레이션입니다. MongoDB에는 데이터가 있습니다. –

1

하나의 옵션은 update 작업을 사용하여 모든 데이터를 한 번에 업데이트하는 것입니다. 다중 업데이트는 개발 릴리스에서 새로 추가되었으므로 그 중 하나를 사용해야합니다.

-1

"이주"스크립트를 자동화하고 추적하기 위해 Activerecord :: Miration에 연결할 수 있습니다.

0

클린트,

업데이트를 수행하는 코드를 작성할 수 있습니다 - 자신의 필드를 기반으로 기록을 갱신 지원되지 않습니다 것 같다하지만.

는 이러한 경우에, 나는 다음과 같은 한 서버에 대해 그것을 실행 :

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

우리는 단지이 하나의 구축 :

출애굽기는 몽고의 정말 멋진 마이그레이션 프레임 워크, 즉 당신이 원하는 수 있습니다 npm).

좋은 mongodb 마이그레이션 프레임 워크가 필요했지만 아무 것도 찾을 수 없었습니다. 그래서 우리는 하나를 만들었습니다.

그것은 많은의 일반 마이그레이션 프레임 워크보다 더 나은 기능이 있습니다

  • 체크섬
  • 가 몽고에 마이그레이션 상태를 지속 (A는 previosuly의 이전 버전과 일치하지 않는 마이그레이션을 실행에서 오류가 발생합니다) (이 정기적 인 상태 파일) 복제에
  • 완벽하게 지원
  • 자동 핸들 롤백 (개발자가 롤백 절차를 지정해야합니다) multip 실행
  • 기능을 설정하지 르 마이그레이션을 동시에 (동기 또는 비동기)

는 희망이 도움이 같은 시간에 서로 다른 데이터베이스에 대해 마이그레이션을 실행할 수

  • 능력!

  • 관련 문제