다양한 스키마 버전 유지 관리
이 페이지의 내용
애플리케이션의 스키마 요구 사항은 시간이 지남에 따라 변경될 수 있습니다. 예를 들어, 새로운 서비스를 사용할 수 있게 되면 문서에 새 필드를 추가해야 할 수도 있습니다. MongoDB의 유연한 데이터 모델은 컬렉션 전체에서 균일하지 않은 문서 구조를 사용할 수 있으며, 업데이트된 스키마와 함께 이전 문서 구조를 유지할 수 있다는 것을 의미합니다.
스키마 버전 관리 패턴을 사용하면 동일한 collection에 여러 버전의 스키마를 보유할 수 있으므로 요구 사항이 변경될 때 대규모 스키마 마이그레이션을 피할 수 있습니다.
이 작업에 대하여
문서에서 여러 레벨에 나타나는 필드가 있는 경우 스키마 버전 관리 패턴이 인덱스에 영향을 줄 수 있습니다. 예를 들어 동일한 필드를 최상위 필드 및 다른 문서의 임베디드 필드로 저장하는 경우 해당 필드에 대한 쿼리를 지원하기 위해 여러 인덱스가 필요할 수 있습니다.
시작하기 전에
다음 예시에서는 온라인 스토어에서 컬렉션을 사용하여 고객 연락처 정보를 추적합니다. 처음에는 집 전화번호와 직장 전화번호만 컬렉션에 포함됩니다. 시간이 지남에 따라 새로운 연락 방법이 추가되고 일부 이전 방법은 더 이상 필요하지 않습니다.
샘플 문서 삽입:
db.contacts.insertOne( { _id: 1, name: "Taylor", home: "209-555-7788", work: "503-555-0110" } )
단계
다음 절차에서는 컬렉션의 초기 스키마 버전을 설정한 다음 다른 스키마로 새 문서를 삽입합니다.
다음 단계
스키마 버전 관리 패턴을 구현한 후에는 애플리케이션에서 데이터를 쿼리하고 업데이트하는 방법을 수정해야 합니다.
컬렉션 쿼리하기
이제 contacts
컬렉션에는 서로 다른 두 개의 스키마가 있으므로 쿼리는 문서의 스키마 버전에 따라 필드 값의 가능한 모든 위치를 확인해야 합니다.
다음 쿼리는 고객의 work
번호를 기반으로 검색합니다. 쿼리는 work
필드의 가능한 두 위치를 모두 확인합니다.
db.contacts.find( { $or: [ { work: "503-555-0110" }, { "contactInfo.work": "503-555-0110" } ] } )
출력:
{ _id: 1, name: 'Taylor', home: '209-555-7788', work: '503-555-0110', schemaVersion: 1 }
컬렉션 문서 업데이트
데이터 삽입과 마찬가지로 컬렉션을 업데이트할 때 애플리케이션은 업데이트할 필드의 가능한 모든 위치를 확인해야 합니다. 데이터를 업데이트할 때 schemaVersion
필드를 사용하여 업데이트할 필드를 결정할 수 있습니다.
사용자 _id: 2
의work
전화번호를 업데이트하려면 다음 명령을 실행하세요.
db.contacts.updateOne( { _id: 2 }, [ { $set: { "work": { $cond: { if: { $eq: [ "$schemaVersion", 1 ] }, then: "999-999-9999", else: null } }, "contactInfo.work": { $cond: { if: { $eq: [ "$schemaVersion", 2 ] }, then: "999-999-9999", else: null } } } } ] )
이전 예제의 경우:
일치하는 문서의
schemaVersion
(이)가1
인 경우work
필드가 업데이트된 값으로 설정됩니다.일치하는 문서의
schemaVersion
(이)가2
인 경우contactInfo.work
필드가 업데이트된 값으로 설정됩니다.