2011-11-23 7 views
7

मुझे मोंगो डीबी में, मोंगोस और नोड.जे.एस. के माध्यम से, मोंगो डीबी में नेस्टेड स्कीमा की कई गहराई को सम्मिलित करने में समस्या हो रही है।नोड, मोंगोस, नेस्टेड स्कीमा की कई गहराई को बचाने में समस्याएं

नीचे दिया गया उदाहरण थोड़ा सा योगदान है लेकिन उम्मीद है कि मेरी समस्या को समझाना चाहिए। क्यों प्रत्येक स्कीमा को एक पूर्ण मॉडल के रूप में परिभाषित किया जाता है लेकिन उदाहरण में उपयोग नहीं किया जाता है, यह सिर्फ इसलिए है क्योंकि मेरी असली दुनिया की समस्या में, वे वास्तविक, प्रयोग योग्य मॉडल हैं और मैं चाहता हूं कि यह उदाहरण प्रासंगिक होने पर यथार्थवादी हो।

तो यहां रिवर्स ऑर्डर में उदाहरण स्कीमा परिभाषाएं हैं, यानी। छोटी से छोटी रूसी गुड़िया पहले:

// Define pen model 
var PenSchema = new Schema({ 
    color: String // black, blue or red 
}); 
var Pen = mongoose.model('Pen', PenSchema); 

// Define ruler model 
var RulerSchema = new Schema({ 
    units: String // inches or millimetres 
}); 
var Ruler = mongoose.model('Ruler', RulerSchema); 

// -------- 

// Define drawing tools model 
var DrawingToolsSchema = new Schema({ 
    label: String, 
    pens: [Pen] 
}); 
var DrawingTools = mongoose.model('DrawingTools', DrawingToolsSchema); 

// Define measuring tools model 
var MeasuringToolsSchema = new Schema({ 
    label: String, 
    ruler: [Ruler] 
}); 
var MeasuringTools = mongoose.model('MeasuringTools', MeasuringToolsSchema); 

// -------- 

// Define stationery box model 
// It has a label and two compartments - tools for drawing and measuring 
var StationeryBoxSchema = new Schema({ 
    label: String, 
    drawingTools: [DrawingToolsSchema], 
    measuringTools: [MeasuringToolsSchema] 
}); 
var StationeryBox = mongoose.model('StationeryBox', StationeryBoxSchema); 

उम्मीद है कि आप इस से बता सकते हैं एक मुख्य मॉडल, StationeryBox है, जो एक लेबल है और DrawingTools और MeasuringTools जो स्कीमा नेस्टेड रहते हैं के लिए दो डिब्बों में शामिल नहीं है। बदले में वे अपने स्वयं के लेबल होते हैं और पेन और शासकों के लिए नेस्टेड स्कीमा होते हैं। मुझे जो समस्या है वह दूसरे स्तर के घोंसले को डाला गया है, यानी। कलम/शासकों। तो मोंगोज़ डॉक्स पर आधारित, शीर्ष स्तर का मॉडल बनाना, और पहली नेस्टेड ऑब्जेक्ट्स में धक्का देना ठीक काम करता है, फिर परेशानी होती है। उदाहरण के लिए:

// To create my stationery box - this works 
var stationery = new StationeryBox({ label: 'My Stationery Box' }); 

// To add the nested compartments - this works 
stationery.drawingTools.push({ label: 'My Pens' }); 
stationery.measuringTools.push({ label: 'My Rulers' }); 

// But this is wrong as 'stationery.drawingTools.pens' is undefined 
stationery.drawingTools.pens.push({ color: 'red' }); 
stationery.drawingTools.pens.push({ color: 'black' }); 

और अगर मैं एक चरण पीछे जाएं और ड्राइंग उपकरण के रूप में एक ही समय में कलम को सम्मिलित करने का प्रयास करें: मैं जानता हूँ कि यह एक सुपर यथार्थवादी उदाहरण नहीं है

// Also wrong - presumably the second level of nesting is the problem 
stationery.drawingTools.push({ 
    label: 'My Pens', 
    pens: [ // These object represent second levels of nested schema 
    { color: 'red' }, 
    { color: 'black' } 
    ] 
}); 

, लेकिन यह एक असली दुनिया प्रणाली का एक सरलीकृत उदाहरण है जिसे मैं बना रहा हूं और यह वर्णन करने का सबसे आसान तरीका था।

वास्तविक बचत इस कोर्स के बाद होती है और मैंने इसे छोड़ दिया है, लेकिन क्या मुझे इन कॉलबैक को सहेजने के लिए इन अगले स्तरों को जोड़ने की ज़रूरत है?

अगर कोई मुझे बता सकता है कि मैं इस पर गलत कहां जा रहा हूं या मुझे सही दिशा में इंगित करता हूं तो मैं आपको एक अच्छा केक खरीदूंगा (काल्पनिक केक केवल मुझे डर है, जब तक कि आप मेरे पास न रहें)।

उत्तर

9

आप बहुत करीब हैं, समस्या वास्तव में आपकी Schema परिभाषाओं में है। यह सब Schema ऑब्जेक्ट और Model ऑब्जेक्ट के बीच के अंतर के लिए नीचे आता है। एम्बेडेड दस्तावेज़ों के साथ mongoose Schema निर्दिष्ट करते समय, आप केवल अन्यSchema पर इंगित कर सकते हैं।

var DrawingToolsSchema = new Schema({ 
    label: String, 
    pens: [Pen] // uh-oh, broken! Pen is a Model. 
}); 

हालांकि, आपके पास StationeryBoxSchema में परिभाषित एम्बेडेड दस्तावेज़ों के पहले स्तर के लिए यह सही है।

var StationeryBoxSchema = new Schema({ 
    label: String, 
    drawingTools: [DrawingToolsSchema], // yes! DrawingToolsSchema is a Schema 
    measuringTools: [MeasuringToolsSchema] // this one too. 
}); 

यह अंतर बाद में आपके सभी अप्रत्याशित व्यवहारों के लिए जिम्मेदार है।

+1

धन्यवाद डैनियल। बेशक, आप पूरी तरह से सही है। यह मूल समस्या पोस्ट करने के कुछ दिनों बाद रहा है और मैंने उस समय बहुत कुछ सीखा है, इसलिए मॉडल को एम्बेड करने का प्रयास करने पर मुझे वास्तव में याद नहीं आ रहा है और स्कीमा मेरे उदाहरण कोड में केवल एक टाइपो नहीं था (जिसमें अगर मेरे पास कहीं और गड़बड़ है) या अगर मैं अपनी "असली दुनिया" कोड में एक ही गलती कर दूंगा (जो तब से बहुत बदल गया है तो मैं जांच नहीं सकता;))। लेकिन जैसा कि आप कहते हैं कि यह बाद के व्यवहार की व्याख्या करेगा ताकि आप शायद सही हो! – tdous

+0

मेरी खुशी - मैं समझता हूं कि इस तरह कुछ काम करते समय कुछ दिनों का समय लगता है। शायद नोड सीखने की वक्र का सबसे तेज हिस्सा यह पता लगा रहा है कि चुपचाप विफल होने वाली समस्याओं को कैसे डिबग करना है। –

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