Docs Menu
Docs Home
/ /
/ / /

Mantén diferentes versiones de esquema

Los requisitos del esquema de su aplicación pueden cambiar con el tiempo. Por ejemplo, cuando estén disponibles nuevos servicios, podría necesitar añadir nuevos campos a sus documentos. El modelo de datos flexible de MongoDB le permite usar una estructura de documento no uniforme en toda su colección y conservar la estructura de documento anterior junto con el esquema actualizado.

El patrón de versiones de esquema le permite tener diferentes versiones de su esquema en la misma colección, lo que evita migraciones de esquema a gran escala cuando cambian los requisitos.

Si tiene un campo que aparece en diferentes niveles en sus documentos, el patrón de control de versiones del esquema puede afectar a sus índices. Por ejemplo, si almacena el mismo campo como campo de nivel superior y como campo incrustado en diferentes documentos, podría necesitar varios índices para admitir consultas en ese campo.

En el siguiente ejemplo, una tienda online utiliza una colección para rastrear la información de contacto de los clientes. Inicialmente, la colección solo contiene los números de teléfono de casa y del trabajo. Con el tiempo, se añaden nuevos métodos de contacto y algunos de los antiguos ya no son necesarios.

Insertar el documento de muestra:

db.contacts.insertOne(
{
_id: 1,
name: "Taylor",
home: "209-555-7788",
work: "503-555-0110"
}
)

El siguiente procedimiento establece la versión del esquema inicial para la colección y luego inserta un nuevo documento con un esquema diferente.

1

Para diferenciar entre diferentes esquemas en la colección, agregue un schemaVersion campo.

El siguiente comando agrega un campo schemaVersion con el valor 1 a los documentos con el esquema inicial:

db.contacts.updateMany(
{ },
{
$set: { schemaVersion: 1 }
}
)
2

En el esquema actualizado, los clientes pueden vincular sus cuentas de redes sociales. Inserte un documento que tenga en cuenta los nuevos requisitos y que tenga un schemaVersion de 2:

db.contacts.insertOne(
{
_id: 2,
schemaVersion: 2,
name: "Cameron",
contactInfo: {
cell: "903-555-1122",
work: "670-555-7878",
instagram: "@camcam9090",
linkedIn: "CameronSmith123"
}
}
)

Después de implementar el patrón de versiones de esquema, debe modificar la forma en que su aplicación consulta y actualiza los datos.

Ahora que hay dos esquemas diferentes en la colección contacts, su consulta debe verificar todas las ubicaciones posibles para un valor de campo dependiendo de la versión del esquema del documento.

La siguiente consulta busca según el número work del cliente. La consulta verifica ambas posibles ubicaciones del campo work:

db.contacts.find(
{
$or: [
{
work: "503-555-0110"
},
{
"contactInfo.work": "503-555-0110"
}
]
}
)

Salida:

{
_id: 1,
name: 'Taylor',
home: '209-555-7788',
work: '503-555-0110',
schemaVersion: 1
}

Al igual que al insertar datos, al actualizar una colección, la aplicación debe comprobar todas las posibles ubicaciones del campo que se va a actualizar. Al actualizar datos, puede usar el campo schemaVersion para determinar el campo que se va a actualizar.

Para actualizar el número de teléfono work del usuario con _id: 2, ejecute este comando:

db.contacts.updateOne(
{ _id: 2 },
[
{
$set: {
"work": {
$cond: {
if: { $eq: [ "$schemaVersion", 1 ] },
then: "999-999-9999",
else: null
}
},
"contactInfo.work": {
$cond: {
if: { $eq: [ "$schemaVersion", 2 ] },
then: "999-999-9999",
else: null
}
}
}
}
]
)

En el ejemplo anterior:

  • Si el schemaVersion del documento coincidente es 1, entonces el campo work se configura con el valor actualizado.

  • Si el schemaVersion del documento coincidente es 2, entonces el campo contactInfo.work se configura con el valor actualizado.

  • Mantén un historial de las versiones de los documentos

  • Validación de esquema

  • Diseñando su esquema

Volver

Mantén el historial de documentos

Obtén una insignia de habilidad

¡Domina gratis la “Optimización del diseño de esquemas”!

Más información

En esta página