Nice programing

Mongoose의 스키마 변경 처리

nicepro 2020. 11. 2. 19:37
반응형

Mongoose의 스키마 변경 처리


애플리케이션이 발전함에 따라 Mongoose 스키마를 업데이트 / 마이그레이션하는 모범 사례 (또는 도구)는 무엇입니까?


업데이트 : 테스트를 거쳐 현재 형식에서는 작동하지 않습니다. 올바른 아이디어를 얻었습니다. 모듈 자체를 크게 조정하여 단일 마이그레이션을 수행했습니다. 그러나 몇 가지 주요 변경 사항과 어떻게 든 다른 스키마를 추적하지 않고는 의도대로 작동하지 않습니다.


몽구스 데이터 마이그레이션을 원하는 것 같습니다.

이는 문서를 사용할 때 문서의 이전 스키마 버전을 마이그레이션하기위한 것으로 mongodb에서 마이그레이션을 처리하는 가장 좋은 방법 인 것 같습니다.

문서 컬렉션 (ala alter table)에서 전체 데이터 세트 마이그레이션을 실행하고 싶지는 않습니다. 서버에 많은 부하를 가하고 애플리케이션 / 서버 다운 타임이 필요할 수 있기 때문입니다. 때로는 모든 문서를 간단히 가져 와서 새 스키마 / 변경 사항을 적용하고 저장을 호출하는 스크립트를 작성해야 할 수도 있지만 언제 / 어디에서 수행해야하는지 이해해야합니다. 예를 들어 doc init에 마이그레이션 논리를 추가하면 마이그레이션 스크립트를 실행하기 위해 서버를 3 시간 동안 중단하는 것보다 성능 저하가 더 클 수 있습니다.

링크도 매우 유용 하다는 것을 알았 습니다. 기본적으로 위의 내용을 더 자세히 반복하고 기본적으로 PHP에서 위의 노드 패키지 개념을 구현합니다.

NB 모듈은 5 개월이 지났고 포크는 0이지만 주위를 둘러보고 있으며 abdelsaid의 응답 스타일보다 더 나은 / 더 도움이되는 것을 찾을 수 없습니다 ..


하지만 재미있게도 MongoDB는 RDBMS의 스키마 문제에 대응하기 위해 태어났습니다. 아무것도 마이그레이션 할 필요가 없으며 필드가 필요한 경우 스키마 정의에 기본값을 설정하기 만하면됩니다.

new Schema({
    name: { type: string }
})

에:

new Schema({
    name: { type: string },
    birthplace: { type: string, required: true, default: 'neverborn' }
});

스키마 변경 사항을 반영하기 위해 데이터베이스를 업데이트해야하는이 문제가 발생했습니다. 몇 가지 조사를 마친 후 mongo 콘솔에서 updateMany () 함수를 사용하여 업데이트를 수행하기로 결정했으며 꽤 잘 작동했다고 생각합니다.

이것을 vimdude의 예제에 적용하려면 코드는 다음과 같습니다.

try { db.<collection>.updateMany( { birthplace: null }, { $set: {"birthplace": "neverborn" } } ); } catch(e) { print(e); }

updateMany () 함수는 필터를 기반으로 컬렉션의 모든 문서를 업데이트합니다. 이 경우 필터는 'birthplace'필드가 null 인 모든 문서를 찾습니다. 그런 다음 'birthplace'라는 문서에 새 필드를 설정하고 해당 값을 'neverborn'으로 설정합니다.

코드를 실행 한 후 상황을 반영하도록 수정되었습니다.

db.<collection>.find().pretty()

변경되었는지 확인합니다. 값이 "neverborn"인 새 필드 "birthplace"가 컬렉션의 각 문서 끝에 표시되어야합니다.

도움이되기를 바랍니다.

참고 URL : https://stackoverflow.com/questions/7617002/dealing-with-schema-changes-in-mongoose

반응형