Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

Mantenha um histórico das versões dos documentos

Nesta página

  • Sobre esta tarefa
  • Antes de começar
  • Passos
  • Próximos passos
  • Saiba mais

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.

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.

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()
}
)

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ção currentPolicies contém somente a revisão de dados atual de cada policyId.

  • 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:

1
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")
}
2
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
}
]

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.

1
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")
}
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 } )

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
}
]
  • Manter diferentes versões de esquema

  • Processo de design de esquema

  • Dados do grupo

Voltar

Controle de Versão