2015-09-19 6 views
8

मेरे पास Assignment schema है जिसमें Groups और Projects का संदर्भ है।एक-एक और एक-कई संदर्भों को हटा रहा है - मोंगोस

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

नीचे मेरी Asssignment स्कीमा

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

तो एक Group/Project निकाल दिया जाता है, कैसे मैं अपने असाइनमेंट स्कीमा को अपडेट कर सकते है।

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

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

stackoverflow में उत्तरों की जोड़ी से, मैं निकालें मिडलवेयर बारे में पता चला है, लेकिन मुझे यकीन है कि कैसे one-one and one-many रिश्ते के लिए इसे लागू करने के लिए नहीं कर रहा हूँ। क्या कोई मुझे ऐसा करने का एक उदाहरण दिखा सकता है।

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

    ); 
}); 

उत्तर

12

रिश्ते:

  1. एक one-to-one is a relationship एक राज्य में केवल एक राजधानी है और एक राजधानी केवल की राजधानी है ऐसा है कि एक राज्य
  2. one-to-many is a relationship जैसे कि मां के पास बच्चे हैं , और बच्चों में केवल एक मां है
  3. many-to-many is a relationship जैसे कि एक पुस्तक कई लेखकों या सह-लेखकों द्वारा लिखी जा सकती है, जबकि लेखक कई पुस्तकें लिख सकते हैं।

एक-एक संबंध - एक Project/Group तो निकाल दिया जाता है, मैं कैसे अद्यतन कर सकते हैं मेरी Assignment स्कीमा।

आमतौर पर आप एक project एक assignment और इसी तरह एक assignment एक project को मैप किया को मैप किया होगा। आप यहां क्या कर सकते हैं एक प्रोजेक्ट को हटा रहा है और फिर असाइनमेंट मॉडल में संबंधित project ढूंढें और उनके संदर्भ हटा दें।

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

एक-अनेक संबंध - तो एक Project/Group निकाल दिया जाता है, कैसे मैं अपने Assignment स्कीमा अद्यतन कर सकते हैं।

इस परिदृश्य में हम एक परियोजना को हटा रहे हैं और फिर assignments ढूंढ रहे हैं जो project से संबंधित है और इसके संदर्भ को हटा रहा है। यहां स्थिति है, एक परियोजना के लिए कई असाइनमेंट हो सकते हैं।

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

निकालें मिडलवेयर

के रूप में, बस एक सुधार है कि पर जॉनी ने कहा आप middleware के माध्यम से एक ही बात प्राप्त कर सकते थे ..

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

आमतौर पर वहाँ कई projects संबंधित हो सकता है assignment और से project से संबंधित कई assignments पर। आपके Project स्कीमा में आपके पास assignment कॉलम होगा जहां एक प्रोजेक्ट एकाधिक असाइनमेंट से संबंधित होगा।

नोट: मिडलवेयर हटाएं मॉडल पर काम नहीं करेंगे और यह केवल आपके दस्तावेज़ों पर काम करेगा। यदि आप remove मिडलवेयर के साथ जा रहे हैं, तो अपने हटाए गए फ़ंक्शन में सुनिश्चित करें, आपको पहले आईडी द्वारा project मिल जाएगा और फिर document पर हटाए गए विधि को लागू करें, ताकि ऊपर काम करने के लिए ... आपका डिलीट फ़ंक्शन इस तरह दिखेगा।

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

removemiddleware में, आप जब कि स्कीमा के लिए मॉडल की एक दस्तावेज़ Model#remove के माध्यम से निकाल दिया जाता है लेने के लिए कार्रवाई तय कर रहे हैं। तो:

  • जब एक समूह निकाल दिया जाता है, तो आप उस समूह के _id सभी असाइनमेंट डॉक्स से करने के लिए group संदर्भ निकालना चाहते हैं।
  • जब कोई प्रोजेक्ट हटा दिया जाता है, तो आप सभी असाइनमेंट डॉक्स से उस प्रोजेक्ट के _id पर projects सरणी तत्व संदर्भों को हटाना चाहते हैं।

जो तुम लागू कर सकते हैं के रूप में:

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); 
}); 
संबंधित मुद्दे