Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

다양한 스키마 버전 유지 관리

이 페이지의 내용

  • 이 작업에 대하여
  • 시작하기 전에
  • 단계
  • 컬렉션에 schemaVersion 필드 추가
  • 업데이트된 스키마가 있는 문서 삽입
  • 다음 단계
  • 컬렉션 쿼리하기
  • 컬렉션 문서 업데이트
  • 자세히 알아보기

애플리케이션의 스키마 요구 사항은 시간이 지남에 따라 변경될 수 있습니다. 예를 들어, 새로운 서비스를 사용할 수 있게 되면 문서에 새 필드를 추가해야 할 수도 있습니다. MongoDB의 유연한 데이터 모델은 컬렉션 전체에서 균일하지 않은 문서 구조를 사용할 수 있으며, 업데이트된 스키마와 함께 이전 문서 구조를 유지할 수 있다는 것을 의미합니다.

스키마 버전 관리 패턴을 사용하면 동일한 collection에 여러 버전의 스키마를 보유할 수 있으므로 요구 사항이 변경될 때 대규모 스키마 마이그레이션을 피할 수 있습니다.

문서에서 여러 레벨에 나타나는 필드가 있는 경우 스키마 버전 관리 패턴이 인덱스에 영향을 줄 수 있습니다. 예를 들어 동일한 필드를 최상위 필드 및 다른 문서의 임베디드 필드로 저장하는 경우 해당 필드에 대한 쿼리를 지원하기 위해 여러 인덱스가 필요할 수 있습니다.

다음 예시에서는 온라인 스토어에서 컬렉션을 사용하여 고객 연락처 정보를 추적합니다. 처음에는 집 전화번호와 직장 전화번호만 컬렉션에 포함됩니다. 시간이 지남에 따라 새로운 연락 방법이 추가되고 일부 이전 방법은 더 이상 필요하지 않습니다.

샘플 문서 삽입:

db.contacts.insertOne(
{
_id: 1,
name: "Taylor",
home: "209-555-7788",
work: "503-555-0110"
}
)

다음 절차에서는 컬렉션의 초기 스키마 버전을 설정한 다음 다른 스키마로 새 문서를 삽입합니다.

1

컬렉션의 서로 다른 스키마를 구분하려면 schemaVersion 필드를 추가합니다.

다음 명령은 초기 스키마가 있는 문서에 1 값이 있는 schemaVersion 필드를 추가합니다.

db.contacts.updateMany(
{ },
{
$set: { schemaVersion: 1 }
}
)
2

업데이트된 스키마에서 고객은 자신의 소셜 미디어 계정을 연결할 수 있습니다. 새 요구 사항을 설명하고 schemaVersion2인 문서를 삽입합니다.

db.contacts.insertOne(
{
_id: 2,
schemaVersion: 2,
name: "Cameron",
contactInfo: {
cell: "903-555-1122",
work: "670-555-7878",
instagram: "@camcam9090",
linkedIn: "CameronSmith123"
}
}
)

스키마 버전 관리 패턴을 구현한 후에는 애플리케이션에서 데이터를 쿼리하고 업데이트하는 방법을 수정해야 합니다.

이제 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: 2work 전화번호를 업데이트하려면 다음 명령을 실행하세요.

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 필드가 업데이트된 값으로 설정됩니다.

  • 문서 버전 기록 유지

  • 스키마 유효성 검사

  • 스키마 설계 프로세스

돌아가기

문서 기록 유지