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.
Acerca de esta tarea
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.
Antes de comenzar
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" } )
Pasos
El siguiente procedimiento establece la versión inicial del esquema para la colección y luego inserta un nuevo documento con un esquema diferente.
Insertar un documento con un esquema actualizado
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" } } )
Próximos pasos
Después de implementar el Schema Versioning Pattern, necesitas modificar cómo tu aplicación query y actualiza los datos.
Consulta de la colección
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 }
Actualizar un documento en la colección
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
schemaVersiondel documento coincidente es1, entonces el campoworkse configura con el valor actualizado.Si el
schemaVersiondel documento coincidente es2, entonces el campocontactInfo.workse configura con el valor actualizado.