MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Rimozione dei riferimenti uno-uno e uno-molti - Mongoose

Relazioni:

  1. Un one-to-one is a relationship in modo tale che uno stato abbia una sola capitale e una capitale sia la capitale di un solo stato
  2. Un one-to-many is a relationship tale che una madre ha molti figli e i bambini hanno una sola madre
  3. Un many-to-many is a relationship tale che un libro può essere scritto da più autori o coautori, mentre un autore può scrivere più libri.

relazione uno-uno - Se un Project/Group è stato rimosso, come posso aggiornare il mio Assignment Schema.

In genere avrai un project mappato su un assignment e allo stesso modo un assignment mappato su un project . quello che puoi fare qui è rimuovere un progetto e quindi trovare il project associato nel modello di assegnazione e rimuovere i relativi riferimenti.

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

relazione uno-molti - Se un Project/Group è stato rimosso, come posso aggiornare il mio Assignment Schema.

In questo scenario stiamo rimuovendo un progetto e quindi troviamo tutti gli assignments che appartiene a questo project e rimuovendo loro il riferimento. Ecco la situazione, ci possono essere molti incarichi per un singolo progetto.

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

Rimuovi il middleware

Puoi ottenere la stessa cosa tramite middleware come sottolineato da Johnny, solo una correzione su questo..

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

In genere possono esserci molti projects appartenente a un assignment e molti assignments appartenenti allo stesso project . Avrai un assignment colonna nel tuo Project Schema in cui un progetto sarà correlato a più incarichi.

Nota: remove middleware non funzionerà sui modelli e funzionerebbe solo sui tuoi documenti. Se stai utilizzando remove middleware assicurati che nella tua funzione di eliminazione trovi project prima tramite id e poi sul document restituito applica il metodo di rimozione, quindi per far funzionare quanto sopra... la tua funzione di eliminazione sarebbe simile a questa.

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