sql >> Base de Datos >  >> NoSQL >> MongoDB

Eliminación de referencias one-one y one-many - Mongoose

Relaciones:

  1. Un one-to-one is a relationship tal que un estado tiene solo una ciudad capital y una ciudad capital es la capital de un solo estado
  2. Un one-to-many is a relationship tal que una madre tiene muchos hijos, y los hijos tienen una sola madre
  3. Un many-to-many is a relationship tal que un libro puede ser escrito por varios autores o coautores, mientras que un autor puede escribir varios libros.

relación uno a uno - Si un Project/Group se elimina, ¿cómo puedo actualizar mi Assignment? Esquema.

Por lo general, tendrá un project asignado a una assignment y de manera similar una assignment asignado a un project . lo que puede hacer aquí es eliminar un proyecto y luego encontrar el project asociado en el modelo de asignación y eliminar sus referencias.

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

relación uno-muchos - Si un Project/Group se elimina, ¿cómo puedo actualizar mi Assignment? Esquema.

En este escenario, estamos eliminando un proyecto y luego buscando todas las assignments que pertenece a este project y eliminando su referencia de ellos. Aquí la situación es que puede haber muchas asignaciones para un solo proyecto.

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

Eliminar el software intermedio

Podría lograr lo mismo a través de middleware como señaló Johnny, solo una corrección sobre eso...

ProjectSchema.pre('remove', function (next) {
    var project = this;
    project.model('Assignment').update(
        { projects: {$in: project.assignments}}, 
        { $pull: { project: project._id } }, 
        { multi: true }, 
        next
     );
});

Por lo general, puede haber muchos projects perteneciente a una assignment y muchas assignments pertenecientes al mismo project . Tendrás una assignment columna en su Project Esquema donde un proyecto se relacionará con múltiples asignaciones.

Nota: remove middleware no funcionará en modelos y solo funcionará en sus documentos. Si va con remove middleware asegúrese de que en su función de eliminación, encuentre project por id primero y luego en el document devuelto aplique el método de eliminación, por lo que para que funcione lo anterior... su función de eliminación se vería así.

delete: function(req, res) {
   return Project.findById(req.params.id, function(err, project){
         return project.remove(function(err){
             if(!err) {
                  console.log(numberAffected);
             } 
           });                
    });
 }