2012-04-02 14 views
5

मैंने मोंगोस में एम्बेडेड और लिंक किए गए दस्तावेज़ों के बारे में कई पोस्ट पढ़ और पढ़ ली हैं। आधार पर मैं क्या पढ़ा है, मैं यह निष्कर्ष निकाला है कि यह स्कीमा वह संरचना निम्न के समान है करने के लिए सबसे अच्छा होगा:,नेस्टेड मोंगोस एम्बेडेड दस्तावेज़ों को कैसे पॉप्युलेट करें

var CategoriesSchema = new Schema({ 
    year   : {type: Number, index: true}, 
    make   : {type: String, index: true}, 
    model   : {type: String, index: true}, 
    body   : {type: String, index: true} 
}); 

var ColorsSchema = new Schema({ 
    name   : String, 
    id    : String, 
    surcharge  : Number 
}); 

var MaterialsSchema = new Schema({ 
    name    : {type: String, index: true}, 
    surcharge   : String, 
    colors    : [ColorsSchema] 
}); 

var StyleSchema = new Schema({ 
    name    : {type: String, index: true}, 
    surcharge   : String, 
    materials   : [MaterialsSchema] 
}); 

var CatalogSchema = new Schema({ 
    name     : {type: String, index: true}, 
    referenceId   : ObjectId, 
    pattern    : String, 
    categories   : [CategoriesSchema], 
    description   : String, 
    specifications  : String, 
    price    : String, 
    cost    : String, 
    pattern    : String, 
    thumbnailPath  : String, 
    primaryImagePath : String, 
    styles    : [StyleSchema] 
}); 

mongoose.connect('mongodb://127.0.0.1:27017/sc'); 
exports.Catalog = mongoose.model('Catalog', CatalogSchema); 

डेटा CategoriesSchema, ColorsSchema और MaterialsSchema में परिभाषित बहुत बार परिवर्तन नहीं होगा अगर कभी। मैंने फैसला किया कि कैटलॉग मॉडल में सभी डेटा होना बेहतर होगा क्योंकि कई श्रेणियां, रंग और सामग्रियां हैं, लेकिन वहां बहुत से लोग नहीं होंगे और मुझे इनमें से कोई भी कैटलॉग से स्वतंत्र नहीं ढूंढ पाएगा।

लेकिन मैं मॉडल को डेटा सहेजने के बारे में पूरी तरह उलझन में हूं। यहाँ है जहाँ मैं स्टम्प्ड हो:

var item = new Catalog; 
item.name = "Seat 1003"; 
item.pattern = "91003"; 
item.categories.push({year: 1998, make: 'Toyota', model: 'Camry', body: 'sedan' }); 
item.styles.push({name: 'regular', surcharge: 10.00, materials(?????)}); 

item.save(function(err){ 

}); 

इस तरह एक नेस्टेड एम्बेडेड स्कीमा, मैं सामग्री और रंगों एम्बेडेड दस्तावेजों में डेटा प्राप्त करने के लिए कैसे के साथ?

.push() विधि नेस्टेड दस्तावेज़ों के लिए उपलब्ध प्रतीत नहीं होती है।

उत्तर

7

एम्बेडेड दस्तावेज़ों की सरणी में push विधि है। सीधे शब्दों में एंबेडेड दस्तावेज़ जोड़ने के शुरू में बनाने item के बाद:

var item = new Catalog; 
item.name = "Seat 1003"; 
item.pattern = "91003"; 
item.categories.push({year: 1998, make: 'Toyota', model: 'Camry', body: 'sedan' }); 

var color = new Color({name: 'color regular', id: '2asdfasdfad', surcharge: 10.00}); 
var material = new Material({name: 'material regular', surcharge: 10.00}); 
var style = new Style({name: 'regular', surcharge: 10.00}); 

तो आप अपने माता-पिता में प्रत्येक एम्बेडेड दस्तावेज़ धक्का कर सकते हैं:

material.colors.push(color); 
style.materials.push(material); 
item.styles.push(style); 

तो फिर तुम संपूर्ण वस्तु आप के रूप में डेटाबेस को बचा सकता है जहां पहले से ही कर:

item.save(function(err){}); 

यही है! और आपके पास एंबेडेड डॉक्यूमेंट्री हैं।

आपके कोड के बारे में कुछ अन्य नोट्स, आपके पास अपने कैटलॉग मॉडल में pattern दो बार है। और अपने अन्य मॉडल प्रकारों तक पहुंचने के लिए, आपको उनको निर्यात करने की भी आवश्यकता होगी:

exports.Catalog = mongoose.model('Catalog', CatalogSchema); 
exports.Color = mongoose.model('Colors', ColorsSchema); 
exports.Material = mongoose.model('Materials', MaterialsSchema); 
exports.Style = mongoose.model('Style', StyleSchema); 
+0

यदि संग्रह में बहुत सारे कैटलॉग हैं। हम विशेष आईडी को कैसे धक्का देंगे ?? –

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