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

문서 버전 기록 유지

이 페이지의 내용

  • 이 작업에 대하여
  • 시작하기 전에
  • 단계
  • 다음 단계
  • 자세히 알아보기

데이터가 변경되면 일부 애플리케이션에서는 이전 버전의 데이터를 계속 사용할 수 있어야 합니다. 문서 버전 관리 패턴 에서 이전 데이터 버전은 현재 데이터와 별도의 컬렉션 에 유지됩니다.

문서 버전 관리 패턴을 사용하면 현재 문서와 해당 문서의 기록을 동일한 데이터베이스에 보관할 수 있으며, 데이터 기록을 관리하기 위해 여러 시스템을 사용할 필요가 없습니다.

문서 버전 관리 패턴은 데이터가 이러한 기준을 충족하는 경우에 가장 잘 작동합니다.

  • 문서는 자주 업데이트되지 않습니다.

  • 버전 추적이 필요한 문서는 거의 없습니다.

  • 현재 데이터와 과거 데이터는 일반적으로 별도로 쿼리됩니다. 문서 버전 관리 패턴에서는 기록 데이터가 현재 데이터와 별도의 컬렉션 에 저장되므로 동일한 작업에서 두 가지를 모두 반환하는 데 비용이 많이 들 수 있습니다.

위의 기준이 사용 사례 에 맞지 않는 경우 다른 해결책을 고려하거나 문서 버전 패턴 구현 방법을 변경하세요.

다음 예시 에서는 보험 회사 가 문서 버전 관리 패턴을 사용하여 고객 정책의 변경 사항을 추적 합니다. 샘플 문서 를 currentPoliciespolicyRevisions 컬렉션에 삽입합니다.

db.currentPolicies.insertOne(
{
policyId: 1,
customerName: "Michelle",
revision: 1,
itemsInsured: [
"golf clubs",
"car"
],
dateSet: new Date()
}
)
db.policyRevisions.insertOne(
{
policyId: 1,
customerName: "Michelle",
revision: 1,
itemsInsured: [
"golf clubs",
"car"
],
dateSet: new Date()
}
)

문서 버전 관리 패턴을 사용하면 정책이 업데이트되면 다음과 같은 쓰기가 발생합니다.

  • 정책이 currentPolicies 컬렉션에서 업데이트됩니다. currentPolicies 컬렉션에는 각 policyId 의 현재 데이터 수정본만 포함되어 있습니다.

  • 원래 정책은 정책 변경 사항을 기록 하기 위해 policyRevisions 컬렉션 에 기록됩니다.

예를 예시 사용자 Michelle이 정책에 감시를 추가하려는 경우 애플리케이션 은 다음 작업을 실행합니다.

1
db.currentPolicies.updateOne(
{ policyId: 1 },
{
$push: {
itemsInsured: "watch"
},
$inc: {
revision: 1
},
$currentDate: {
dateSet: true
}
}
)

업데이트된 문서:

{
_id: ObjectId("661e873d1a930b8ea1f75c57"),
policyId: 1,
customerName: 'Michelle',
revision: 2,
itemsInsured: [ 'golf clubs', 'car', 'watch' ],
dateSet: ISODate("2024-04-16T14:12:24.476Z")
}
2
db.currentPolicies.aggregate( [
{
$match: { policyId: 1 }
},
{
$set: { _id: new ObjectId() }
},
{
$merge: {
into: { db: "test", coll: "policyRevisions" },
on: "_id",
whenNotMatched: "insert"
}
}
] )

이전 집계 을 실행 한 후에는 policyRevisions 컬렉션 에 원본 정책과 업데이트된 정책이 모두 포함됩니다.

[
{
_id: ObjectId("6626c8f02a98aba8ddec31d1"),
policyId: 1,
customerName: 'Michelle',
revision: 1,
itemsInsured: [ 'golf clubs', 'car' ],
dateSet: ISODate("2024-04-22T20:30:40.809Z")
},
{
_id: ObjectId("6626c92b2a98aba8ddec31d2"),
customerName: 'Michelle',
dateSet: ISODate("2024-04-22T20:31:03.000Z"),
itemsInsured: [ 'golf clubs', 'car', 'watch' ],
policyId: 1,
revision: 2
}
]

고객의 정책 기록을 보려면 policyRevisions 컬렉션 을 수정본별로 정렬하면 됩니다. 고객 Michelle이 정책을 한 번 더 변경하여 더 이상 골프채에 대한 보장을 원하지 않는다고 가정해 보겠습니다.

1
db.currentPolicies.updateOne(
{ policyId: 1 },
{
$pull: {
itemsInsured: "golf clubs"
},
$inc: {
revision: 1
},
$currentDate: {
dateSet: true
}
}
)

업데이트된 문서:

{
_id: ObjectId("661e873d1a930b8ea1f75c57"),
policyId: 1,
customerName: 'Michelle',
revision: 3,
itemsInsured: [ 'car', 'watch' ],
dateSet: ISODate("2024-04-16T14:13:38.203Z")
}
2
db.currentPolicies.aggregate( [
{
$match: { policyId: 1 }
},
{
$set: { _id: new ObjectId() }
},
{
$merge: {
into: { db: "test", coll: "policyRevisions" },
on: "_id",
whenNotMatched: "insert"
}
}
] )
3
db.policyRevisions.find( { policyId: 1 } ).sort( { revision: 1 } )

출력:

[
{
_id: ObjectId("6626c8f02a98aba8ddec31d1"),
policyId: 1,
customerName: 'Michelle',
revision: 1,
itemsInsured: [ 'golf clubs', 'car' ],
dateSet: ISODate("2024-04-22T20:30:40.809Z")
},
{
_id: ObjectId("6626c92b2a98aba8ddec31d2"),
customerName: 'Michelle',
dateSet: ISODate("2024-04-22T20:31:03.000Z"),
itemsInsured: [ 'golf clubs', 'car', 'watch' ],
policyId: 1,
revision: 2
},
{
_id: ObjectId("6626c9832a98aba8ddec31d3"),
customerName: 'Michelle',
dateSet: ISODate("2024-04-22T20:32:43.232Z"),
itemsInsured: [ 'car', 'watch' ],
policyId: 1,
revision: 3
}
]
  • 다양한 스키마 버전 유지 관리

  • 스키마 설계 프로세스

  • 그룹 데이터

돌아가기

버전 관리