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