2015-09-19 8 views
8

Mam numer Assignment schema, który ma odniesienia do Groups i Projects.Usuwanie odniesień jedno- i jedno-wielu - Mongoose

Assignment == Group [One-One Relationship] 
Assignment == Projects [One-Many Relationship] 

Poniżej jest moje Asssignment Schema

var AssignmentSchema = new Schema({ 
    name: String, 
    group: { 
     type: Schema.Types.ObjectId, 
     ref: 'Group' 
    }, 
    projects: [{type: mongoose.Schema.Types.ObjectId, ref: 'Project'}], 
}); 

Jeśli Group/Project jest usuwany, w jaki sposób mogę zaktualizować mojego zadania schematu.

var ProjectSchema = new Schema({ 
    name: String 
}); 

var GroupSchema = new Schema({ 
    name: String 
}); 

Od kilku odpowiedzi w stackoverflow, poznałem o Remove middleware, ale nie jestem pewien, jak wdrożyć go do one-one and one-many relacji. Czy ktokolwiek może mi pokazać przykład tego działania?

ProjectSchema.pre('remove', function(next){ 
    this.model('Assignment').update(

    ); 
}); 

Odpowiedz

12

zależności:

  1. one-to-one is a relationship takie, że państwo ma tylko jeden stolicę a stolica to stolica tylko jeden stan
  2. A one-to-many is a relationship taki, że matka ma wiele dzieci , a dzieci mają tylko jedną matkę, tak, że książka może być napisana przez kilku autorów lub współautorów, podczas gdy autor może napisać kilka książek o numerach .

jeden-jeden związek - Jeśli Project/Group jest usuwany, w jaki sposób mogę zaktualizować Assignment schematu.

Zazwyczaj trzeba będzie jeden project odwzorowane na jednym assignment i podobnie jednej assignment odwzorowywane na jeden project. możesz tutaj usunąć projekt, a następnie znaleźć skojarzony model project w modelu przypisania i usunąć ich odniesienia.

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

jeden-wielu - Jeśli Project/Group jest usuwany, w jaki sposób mogę zaktualizować Assignment schematu.

W tym scenariuszu usuwamy projekt, a następnie znajdujemy cały obiekt assignments należący do tego project i usuwamy z niego jego odniesienie. Tutaj sytuacja jest taka, że ​​może być wiele zadań dla pojedynczego projektu.

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

Usuń middleware

Można osiągnąć to samo poprzez middleware jak podkreślił Johnny, tylko korekty na tym ..

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

Zazwyczaj nie może być wiele projects przynależności do assignment i wielu assignments należących do tego samego project. Będziesz mieć kolumnę assignment w swoim schemacie Project, gdzie jeden projekt będzie odnosić się do wielu przydziałów.

Uwaga: oprogramowanie pośredniczące do usuwania oprogramowania nie działa na modelach i działałoby tylko na dokumentach. Jeśli korzystasz z oprogramowania pośredniego remove w swojej funkcji usuwania, najpierw znajdziesz project według ID, a następnie na zwróconym document zastosuj metodę usuwania, więc aby powyższe działało ... Twoja funkcja usuwania wyglądałaby tak.

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

W removemiddleware, jesteś określające działania należy podjąć, gdy dokument modelu dla tego schematu jest usuwany poprzez Model#remove. Więc:

  • Kiedy grupa zostanie usunięta, chcesz usunąć odniesienie do tej grupy na _id ze wszystkich docs przypisania group.
  • Po usunięciu projektu, chcesz usunąć odniesienia do tablicy tablicy projects do tego projektu _id ze wszystkich dokumentów przypisania.

które można wdrożyć jako:

GroupSchema.pre('remove', function(next) { 
    var group = this; 
    group.model('Assignment').update(
     { group: group._id }, 
     { $unset: { group: 1 } }, 
     { multi: true }, 
     next); 
}); 

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