2012-08-10 29 views
19

में हटाए जाने पर वस्तुओं को संदर्भित हटाने की मैं इस तरह एक स्कीमा है लगता है:स्वचालित रूप से MongoDB

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

var Assignment = new Schema({ 
    name: String, 
    person: ObjectID 
}); 

अगर मैं एक व्यक्ति को हटाना, वहां अभी भी अनाथ हो कार्य छोड़ दिया जा सकता है एक व्यक्ति जो मौजूद नहीं है का संदर्भ है, जो डेटाबेस में अपर्याप्त अव्यवस्था बनाता है।

क्या यह सुनिश्चित करने का एक आसान तरीका है कि जब कोई व्यक्ति हटा दिया जाता है, तो उस व्यक्ति के सभी संबंधित संदर्भ भी हटा दिए जाएंगे?

उत्तर

26

आप अन्य सभी दस्तावेजों उसका संदर्भ से उस व्यक्ति को दूर करने के Person स्कीमा पर अपने खुद के 'remove' नेवला middleware जोड़ सकते हैं। आपके मिडलवेयर फ़ंक्शन में, thisPerson दस्तावेज़ हटाया जा रहा है।

Person.pre('remove', function(next) { 
    // Remove all the assignment docs that reference the removed person. 
    this.model('Assignment').remove({ person: this._id }, next); 
}); 
+1

क्या होगा अगर इसमें ऑब्जेक्ट आईडी की गहरी घोंसला वाली सरणी हो? 'डेटा की तरह: {व्यक्ति: [{ObjectID}]}'? – vhflat

+0

@vhflat शायद सभी विशिष्टताओं के साथ इसके बारे में एक नया प्रश्न पोस्ट करने के लिए सबसे अच्छा है। – JohnnyHK

+0

@ जॉनीनीएचके, लेकिन समवर्ती के बारे में क्या? क्या होगा यदि व्यक्ति को हटाया जा रहा है, जबकि एक असाइनमेंट बनाया जा रहा है? मैंने इस समस्या को मेरे प्रश्न http://stackoverflow.com/q/42521550 के जवाब में हल करने का प्रयास किया, लेकिन मुझे लगता है कि एक बेहतर तरीका होना चाहिए! क्या आप इसे देख सकते हैं? –

8

यदि "सरल" से आपका मतलब है "अंतर्निर्मित", तो नहीं। MongoDB सभी के बाद एक संबंधपरक डेटाबेस नहीं है। आपको अपनी सफाई प्रणाली को लागू करने की आवश्यकता है।

0

आप सॉफ्ट डिलीट का उपयोग कर सकते हैं। व्यक्ति संग्रह से व्यक्ति को हटाएं इसके बजाए isDelete बूलियन ध्वज को सही पर उपयोग करें।

संबंधित मुद्दे