2013-02-19 2 views
0

나는 하나의 문서에 수동 참조가 포함 된 두 개의 모음을 갖도록 체계를 설계하는 실수를했습니다. 이제 부모 컬렉션에 다른 컬렉션이 하위 문서로 포함되도록해야한다고 생각했습니다.MongoDB : 참조 된 문서 모음을 서브 문서로 복사

문제는 이미 수백 개의 항목이 이미 만들어진 프로덕션 환경에이 구성표를 넣었습니다. 내가 뭘하고 싶은지 어떻게 든 기존의 데이터를 모두 스캔하고 하위 문서로 참조 된 parent_id에 항목을 복사합니다. 을 변경하는 빠른 방법이 있나요 사진

_id 
url 
user_id 

- 사용자

_id 
Name 

컬렉션 2 -

컬렉션 1 : 여기

내 스키마의 예입니다 기존 문서는 다음과 같이 하나의 컬렉션이됩니다 :

컬렉션 - 내가 제대로 데이터베이스 설정이 있으면 사용자

_id 
Name 
Photos: [...] 

, 나는 쉽게 새로운 하나를 사용하려면 코드를 수정할 수 있지만 제가하는 데 문제는 파악하는 방법을 신속/절차 부모에게 문서를 복사하십시오.

추가 세부 사항 - MongoDB를 호스팅하기 위해 MongoHQ.com을 사용하고 있습니다.

감사합니다.

+1

당신은 코드에서이 같은 스키마 마이그레이션 자신을 돌볼 필요가있다.'User' 스키마를 업데이트 한 다음 컬렉션을 반복하여 컬렉션을 업데이트하여 새로운 스키마를 반영하십시오. – JohnnyHK

답변

0

나는 환경의 특성을 잘 모르지만, 변화의이 종류는 일반적으로 단계의 다음과 같은 종류가 포함됩니다

  1. Photos 배열이있을 경우 기존 코드는 불평하지 않는지 확인 User 객체. 새로운 UserPhoto 문서
  2. 가 복사하는 사용자 documentsPhoto 문서를 마이그레이션 스크립트를 실행 생성되지 않도록
  3. 응용 프로그램을 "일시 정지". 이 드라이버를 사용하여 자바 스크립트 나 응용 프로그램 코드를 통해 하나 만들 꽤 쉽게해야
  4. 배포 배열
  5. 에 포함 할 Photos을 기대하는 응용 프로그램의 새 버전 (아래 예 참조)에 응용 프로그램을 "고정 해제" 당신이 "고정/고정 취소는"새 응용 프로그램이 배포 된 후 새로 Photo 문서를 만들어 마이그레이션 할 4 단계 후 델타 스크립트를 실행해야합니다 수없는 경우 새 문서

을 만들기 시작합니다.

스크립트는이 (안된)과 같이 보일 것입니다 :

db.User.find().forEach(function (u) { 
    u.Photos = new Array(); 
    db.Photo.find({user_id : u._id}).forEach(function (p) { 
     u.Photos.push(p); 
    } 
    db.User.Save(u); 
} 
+0

고마워요. 그게 제가 찾고 있던 바로 그 겁니다. 어쨌든 그때는 좀 더 복잡해질 것이라고 생각했지만 분명히 설명하는 것이 도움이됩니다. –