Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
/ / /

Mantén diferentes versiones de esquema

Los requisitos de esquema de la aplicación pueden cambiar con el tiempo. Por ejemplo, cuando se disponga de nuevos servicios, puede que se necesite añadir nuevos campos a los documentos. El modelo de datos flexible de MongoDB significa que puedes utilizar una estructura de documentos no uniforme en toda tu colección, y puedes conservar tu estructura de documentos 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 tienes un campo que aparece en diferentes niveles en tus documentos, el patrón de control de versiones de esquemas puede afectar tus índices. Por ejemplo, si almacenas el mismo campo tanto como campo de nivel superior como un campo incrustado en diferentes documentos, es posible que necesites múltiples índices para soportar consultas sobre ese campo.

En el siguiente ejemplo, una tienda en línea utiliza una colección para realizar un seguimiento de la información de contacto de los clientes. Al principio, la colección solo contiene los números de teléfono de casa y del trabajo. Con el tiempo, se agregan nuevos métodos de contacto y algunos métodos más antiguos 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 inicial del esquema 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 .

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 contemple los nuevos requisitos y 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 Schema Versioning Pattern, necesitas modificar cómo tu aplicación query y actualiza los datos.

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

La siguiente query realiza una búsqueda basada en el número work del cliente. La query verifica ambas ubicaciones posibles para el 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
}

Similar a cómo insertar datos, cuando actualizas una colección, tu aplicación debe verificar todas las ubicaciones posibles del campo que se actualizará. Cuando actualices datos, puedes usar el campo schemaVersion para determinar el campo a actualizar.

Para actualizar el número de teléfono work para el usuario con _id: 2, ejecuta 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