Mantenha um histórico das versões dos documentos
Quando seus dados mudam, alguns aplicativos exigem que versões mais antigas de seus dados sejam mantidas disponíveis. No Padrão de versionamento de documentos, as versões de dados mais antigas são mantidas em uma collection separada dos dados atuais.
O padrão de controle de versão de documentos permite manter os documentos atuais e seu histórico no mesmo banco de dados, evitando o uso de vários sistemas para gerenciar o histórico de dados.
Sobre esta tarefa
O Padrão de Versão de Documento funciona melhor se os seus dados atenderem a estes critérios:
Os documentos são atualizados com pouca frequência.
Existem poucos documentos que exigem rastreamento de versão.
Dados atuais e dados históricos são geralmente consultados separadamente. No Padrão de Versão de Documentos, os dados históricos são armazenados em uma coleção separada dos dados atuais, portanto, retornar ambos na mesma operação pode ser caro.
Se os critérios anteriores não se adequarem ao seu caso de uso, considere uma solução diferente ou altere a forma como você implementa o Padrão de Controle de Versão de Documentos.
Antes de começar
No exemplo a seguir, uma companhia de seguros usa o Padrão de Controle de Versão de Documentos para rastrear alterações nas políticas do cliente . Insira o documento de amostra nas coleções currentPolicies
e 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() } )
Passos
Com o Padrão de Versão de Documentos, quando uma política é atualizada, ocorrem as seguintes gravações:
A política é atualizada na coleção
currentPolicies
. A coleçãocurrentPolicies
contém somente a revisão de dados atual de cadapolicyId
.A política original é gravada na coleção
policyRevisions
para manter um registro das alterações da política.
Por exemplo, se o usuário Michelle quiser adicionar um relógio à sua política, o aplicação executará estas operações:
Atualizar a política na coleção currentPolicies
db.currentPolicies.updateOne( { policyId: 1 }, { $push: { itemsInsured: "watch" }, $inc: { revision: 1 }, $currentDate: { dateSet: true } } )
documento atualizado:
{ _id: ObjectId("661e873d1a930b8ea1f75c57"), policyId: 1, customerName: 'Michelle', revision: 2, itemsInsured: [ 'golf clubs', 'car', 'watch' ], dateSet: ISODate("2024-04-16T14:12:24.476Z") }
Grave a política atualizada na coleção PolicyRevisions
db.currentPolicies.aggregate( [ { $match: { policyId: 1 } }, { $set: { _id: new ObjectId() } }, { $merge: { into: { db: "test", coll: "policyRevisions" }, on: "_id", whenNotMatched: "insert" } } ] )
Depois de executar a agregação anterior, a collection policyRevisions
contém as políticas originais e atualizadas:
[ { _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 } ]
Próximos passos
Para visualizar o histórico da política de um cliente, você pode classificar a coleção policyRevisions
por revisão. Considere se a cliente Michelle fizer outra alteração em sua política e não quiser mais fazer seguro de seus tacos de campo.
Atualizar a política na coleção currentPolicies
db.currentPolicies.updateOne( { policyId: 1 }, { $pull: { itemsInsured: "golf clubs" }, $inc: { revision: 1 }, $currentDate: { dateSet: true } } )
documento atualizado:
{ _id: ObjectId("661e873d1a930b8ea1f75c57"), policyId: 1, customerName: 'Michelle', revision: 3, itemsInsured: [ 'car', 'watch' ], dateSet: ISODate("2024-04-16T14:13:38.203Z") }
Retornar um histórico das alterações da política
db.policyRevisions.find( { policyId: 1 } ).sort( { revision: 1 } )
Saída:
[ { _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 } ]