Manter diferentes versões de esquema
Nesta página
Os requisitos de esquema do seu aplicativo podem mudar com o tempo. Por exemplo, quando novos serviços forem disponibilizados, poderá ser necessário adicionar novos campos aos seus documentos. O modelo de dados flexível do MongoDB significa que você pode usar uma estrutura de documento não uniforme em toda a sua coleção e manter sua estrutura de documento mais antiga junto com o esquema atualizado.
O Padrão de versionamento de esquema permite que você tenha versões diferentes do seu esquema na mesma coleção, o que evita migrações de esquemas em grande escala quando os requisitos mudam.
Sobre esta tarefa
Se houver um campo que aparece em níveis diferentes nos seus documentos, o Padrão de Versão de esquema poderá afetar seus índices. Por exemplo, se você armazenar o mesmo campo como um campo de nível superior e como um campo incorporado em documentos diferentes, poderá precisar de vários índices para oferecer suporte a queries nesse campo.
Antes de começar
No exemplo a seguir, uma loja online usa uma coleção para rastrear informações de contato do cliente. No início, a coleção contém apenas números de telefone de casa e do trabalho. Com o tempo, novos métodos de contato são adicionados e alguns métodos mais antigos não são necessários.
Insira o documento de amostra:
db.contacts.insertOne( { _id: 1, name: "Taylor", home: "209-555-7788", work: "503-555-0110" } )
Passos
O procedimento a seguir define a versão inicial do esquema para a coleção e, em seguida, insere um novo documento com um esquema diferente.
Inserir um documento com um esquema atualizado
No esquema atualizado, os clientes podem vincular suas contas de mídia social. Insira um documento que atenda aos novos requisitos e tenha um 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 passos
Depois de implementar o Schema Versioning Pattern, você precisa modificar a forma como a sua aplicativo faz query e atualiza os dados.
Consulte a coleção
Agora que há dois esquemas diferentes na coleção contacts
, sua query deve verificar todos os locais possíveis para obter um valor de campo dependendo da versão do esquema do documento.
A query a seguir executa uma pesquisa com base no número de work
do cliente. A query verifica os dois locais possíveis para o campo work
:
db.contacts.find( { $or: [ { work: "503-555-0110" }, { "contactInfo.work": "503-555-0110" } ] } )
Saída:
{ _id: 1, name: 'Taylor', home: '209-555-7788', work: '503-555-0110', schemaVersion: 1 }
Atualizar um documento na coleção
De maneira semelhante à inserção de dados, ao atualizar uma coleção, seu aplicativo deve verificar todos os locais possíveis em busca do campo a ser atualizado. Ao atualizar dados, é possível usar o campo schemaVersion
para determinar o campo a ser atualizado.
Para atualizar o número de telefone do usuário do work
com _id: 2
, execute 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 } } } } ] )
No exemplo anterior:
Se o
schemaVersion
do documento correspondente for1
, o campowork
será preenchido com o valor atualizado.Se o
schemaVersion
do documento correspondente for2
, o campocontactInfo.work
será preenchido com o valor atualizado.