Docs Menu
Docs Home
/ /
/ / /

Mantén un historial de las versiones de los documentos

Cuando los datos cambian, algunas aplicaciones requieren que las versiones anteriores de los datos estén disponibles. En el patrón de versionado de documentos, las versiones anteriores de los datos se conservan en una colección separada de los datos actuales.

El patrón de control de versiones de documentos te permite mantener los documentos actuales y su historial en la misma base de datos, y evitar tener que utilizar varios sistemas para gestionar el historial de datos.

El patrón de control de versiones de los documentos funciona mejor si los datos cumplen estos criterios:

  • Los documentos se actualizan con poca frecuencia.

  • Hay pocos documentos que requieren seguimiento de versiones.

  • Los datos actuales y los datos históricos generalmente se consultan por separado. En el patrón de versiones de documentos, los datos históricos se almacenan en una colección separada de los datos actuales, por lo que devolver ambos en la misma operación puede resultar caro.

Si los criterios anteriores no se ajustan al caso de uso, se puede considerar una solución diferente o cambiar la forma de implementar el patrón de control de versiones de documentos.

En el siguiente ejemplo, una compañía de seguros utiliza el patrón de control de versiones de documentos para realizar el seguimiento de los cambios en las pólizas de los clientes. Inserte el documento de muestra en el currentPolicies y policyRevisions colecciones:

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

Con el patrón de versionado de documentos, cuando se actualiza una política, ocurren las siguientes operaciones de escritura:

  • La política se actualiza en la colección currentPolicies. La colección currentPolicies solo contiene la revisión de datos actual de cada policyId.

  • La política original se redacta en la colección policyRevisions para mantener un registro de los cambios en la política.

Por ejemplo, si la usuaria Michelle desea agregar un reloj a su póliza, la aplicación ejecuta estas operaciones:

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

Documento actualizado:

{
_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"
}
}
] )

Después de que se ejecute la agregación anterior, la colección policyRevisions contiene las políticas originales y las actualizadas:

[
{
_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 ver el historial de políticas de un cliente, se puede ordenar la colección policyRevisions por revisión. Considerar si la cliente Michelle hace otro cambio en su póliza y ya no quiere asegurar sus palos de golf.

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

Documento actualizado:

{
_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 } )

Salida:

[
{
_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
}
]
  • Mantén diferentes versiones de esquema

  • Diseñando su esquema

  • Datos de grupo

Volver

Control de versiones

En esta página