문서 버전 기록 유지
데이터가 변경되면 일부 애플리케이션에서는 이전 버전의 데이터를 계속 사용할 수 있어야 합니다. 문서 버전 관리 패턴 에서 이전 데이터 버전은 현재 데이터와 별도의 컬렉션 에 유지됩니다.
문서 버전 관리 패턴을 사용하면 현재 문서와 해당 문서의 기록을 동일한 데이터베이스에 보관할 수 있으며, 데이터 기록을 관리하기 위해 여러 시스템을 사용할 필요가 없습니다.
이 작업에 대하여
문서 버전 관리 패턴은 데이터가 이러한 기준을 충족하는 경우에 가장 잘 작동합니다.
문서는 자주 업데이트되지 않습니다.
버전 추적이 필요한 문서는 거의 없습니다.
현재 데이터와 과거 데이터는 일반적으로 별도로 쿼리됩니다. 문서 버전 관리 패턴에서는 기록 데이터가 현재 데이터와 별도의 컬렉션 에 저장되므로 동일한 작업에서 두 가지를 모두 반환하는 데 비용이 많이 들 수 있습니다.
위의 기준이 사용 사례 에 맞지 않는 경우 다른 해결책을 고려하거나 문서 버전 패턴 구현 방법을 변경하세요.
시작하기 전에
다음 예시 에서는 보험 회사 가 문서 버전 관리 패턴을 사용하여 고객 정책의 변경 사항을 추적 합니다. 샘플 문서 를 currentPolicies
및 policyRevisions
컬렉션에 삽입합니다.
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이 정책에 감시를 추가하려는 경우 애플리케이션 은 다음 작업을 실행합니다.
currentPolicies 컬렉션에서 정책 업데이트
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") }
PolicyRevisions 컬렉션에 업데이트된 정책을 씁니다.
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이 정책을 한 번 더 변경하여 더 이상 골프채에 대한 보장을 원하지 않는다고 가정해 보겠습니다.
currentPolicies 컬렉션에서 정책 업데이트
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") }
정책 변경 내역 반환
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 } ]