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.
Acerca de esta tarea
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.
Antes de comenzar
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" } )
Pasos
El siguiente procedimiento establece la versión del esquema inicial para la colección y luego inserta un nuevo documento con un esquema diferente.
Agregar un campo schemaVersion a la colección
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 } } )
Insertar un documento con un esquema actualizado
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" } } )
Próximos pasos
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.
Consulta de la colección
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 }
Actualizar un documento en la colección
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
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.