1
resposta

Dúvida a respeito do vínculo dos dados.

Boa noite tudo bem?

Gostaria de entender uma coisa. Se nós quisermos por exemplo alterar o nome de um autor quando aquele mesmo autor já possui livros cadastrados provavelmente essa alteração não irá se refletir em documentos de outras coleções como livros correto? Não ocorre uma cascata de alterações, nesse caso existe alguma maneira de atrelar esses dados para que se em outro lugar a informação mude ela reflita em outras coleções? Imagino que isso foge um pouco da ideia de bancos não relacionais.

1 resposta

Olá, Caio.

Tudo bem?

Você está correto ao pensar que, em bancos de dados não relacionais como o MongoDB, as alterações em documentos não se propagam automaticamente para outros documentos que referenciam esses dados. Isso acontece porque, ao contrário dos bancos de dados relacionais, onde podemos ter chaves estrangeiras e relacionamentos diretos, os bancos de dados NoSQL como o MongoDB são mais flexíveis e não possuem esse tipo de vínculo automático.

Para resolver essa questão e garantir que as alterações em um documento sejam refletidas em outros, você tem algumas opções:

  1. Referenciamento Manual:

    • Você pode armazenar o ID do autor no documento de livro e, sempre que precisar das informações do autor, fazer uma consulta adicional para buscar esses dados. Isso é conhecido como "referenciamento manual".
    • Exemplo:
      const livroSchema = new mongoose.Schema({
        titulo: { type: String, required: true },
        autor: { type: mongoose.Schema.Types.ObjectId, ref: 'Autor' }
      });
      
    • Quando você buscar um livro, pode usar o método populate do Mongoose para preencher os dados do autor:
      Livro.find().populate('autor').exec((err, livros) => {
        // livros agora contém os dados dos autores populados
      });
      
  2. Eventos de Middleware do Mongoose:

    • Você pode usar middlewares do Mongoose, como pre('save') ou pre('update'), para atualizar os documentos relacionados sempre que um documento for alterado.
    • Exemplo:
      autorSchema.pre('save', async function(next) {
        const autor = this;
        await Livro.updateMany({ autor: autor._id }, { $set: { 'autor.nome': autor.nome } });
        next();
      });
      
  3. Estratégia de Embedding:

    • Outra abordagem é embutir (embed) os dados do autor diretamente no documento do livro. Isso pode ser útil se os dados do autor não mudarem com frequência.
    • Exemplo:
      const livroSchema = new mongoose.Schema({
        titulo: { type: String, required: true },
        autor: {
          nome: String,
          nacionalidade: String
        }
      });
      

Cada uma dessas abordagens tem suas vantagens e desvantagens, e a escolha depende da frequência com que os dados mudam e das necessidades específicas do seu projeto.

Espero ter ajudado e bons estudos!