Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

Manter diferentes versões de esquema

Nesta página

  • Sobre esta tarefa
  • Antes de começar
  • Passos
  • Adicione um campo schemaVersion à coleção
  • Inserir um documento com um esquema atualizado
  • Próximos passos
  • Consulte a coleção
  • Atualizar um documento na coleção
  • Saiba mais

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.

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.

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"
}
)

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.

1

Para diferenciar entre diferentes esquemas na coleção, adicione um campo schemaVersion .

O comando a seguir adiciona um campo schemaVersion com o valor 1 aos documentos com o esquema inicial:

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

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"
}
}
)

Depois de implementar o Schema Versioning Pattern, você precisa modificar a forma como a sua aplicativo faz query e atualiza os dados.

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
}

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 for 1, o campo work será preenchido com o valor atualizado.

  • Se o schemaVersion do documento correspondente for 2, o campo contactInfo.work será preenchido com o valor atualizado.

  • Mantenha um histórico das versões dos documentos

  • Validação de esquema

  • Processo de design de esquema

Voltar

Manter histórico do documento