MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Removendo referências um-um e um-muitos - Mongoose


Relacionamentos:
  1. Um one-to-one is a relationship tal que um estado tem apenas uma capital e uma capital é a capital de apenas um estado
  2. Um one-to-many is a relationship tal que uma mãe tem muitos filhos, e os filhos têm apenas uma mãe
  3. Um many-to-many is a relationship tal que um livro pode ser escrito por vários autores ou coautores, enquanto um autor pode escrever vários livros.

relacionamento um-um - Se um Project/Group for removido, como posso atualizar minha Assignment Esquema.

Normalmente você terá um project mapeado para uma assignment e da mesma forma uma assignment mapeado para um project . o que você pode fazer aqui é remover um projeto e encontrar o project associado no modelo de atribuição e remova suas referências.
delete: function(req, res) {
   return Project.findById(req.params.id, function(err, project){
         return project.remove(function(err){
             if(!err) {
                 Assignment.update({_id: project.assignment}}, 
                      {$pull: {projects: project._id}}, 
                          function (err, numberAffected) {
                            console.log(numberAffected);
                      } else {
                        console.log(err);                                      
                    }
                  });
            });
        });
}

relacionamento um-muitos - Se um Project/Group for removido, como posso atualizar minha Assignment Esquema.

Neste cenário, estamos removendo um projeto e, em seguida, localizando todas as assignments que pertence a este project e removendo sua referência deles. Aqui a situação é, pode haver muitas atribuições para um único projeto.
delete: function(req, res) {
   return Project.findById(req.params.id, function(err, project){
         return project.remove(function(err){
             if(!err) {
                 Assignment.update({_id: {$in: project.assingments}}, 
                      {$pull: {project: project._id}}, 
                           function (err, numberAffected) {
                            console.log(numberAffected);
                      } else {
                        console.log(err);                                      
                    }
                  });
            });
        });
}

Remover middleware

Você pode conseguir a mesma coisa via middleware como apontado por Johnny, apenas uma correção sobre isso ..
ProjectSchema.pre('remove', function (next) {
    var project = this;
    project.model('Assignment').update(
        { projects: {$in: project.assignments}}, 
        { $pull: { project: project._id } }, 
        { multi: true }, 
        next
     );
});

Normalmente pode haver muitos projects pertencente a uma assignment e muitas assignments pertencente ao mesmo project . Você terá uma assignment coluna em seu Project Esquema em que um projeto se relacionará com várias atribuições.

Observação: remover middleware não funcionará em modelos e funcionaria apenas em seus documentos. Se você estiver usando remove middleware assegure-se de que em sua função de exclusão, você encontre project por id primeiro e depois no document retornado aplique o método remove, então para que o acima funcione... sua função delete ficaria assim.
delete: function(req, res) {
   return Project.findById(req.params.id, function(err, project){
         return project.remove(function(err){
             if(!err) {
                  console.log(numberAffected);
             } 
           });                
    });
 }