2013-06-21 11 views
6

डुप्लिकेट किए बिना ऑब्जेक्ट्स को एक दूसरे से जोड़ना मेरे पास एक मॉडल "श्रेणी" है। संग्रह categories में कई ऑब्जेक्ट्स हैं। मेरे पास मॉडल "पोस्ट" भी है। संग्रह posts में उपयोगकर्ताओं की पोस्ट के साथ बहुत सारी चीज़ें हो सकती हैं। "पोस्ट" ऑब्जेक्ट 1+ श्रेणियों से संबंधित हो सकता है। "पोस्ट" ऑब्जेक्ट को 1+ "श्रेणी" से कैसे लिंक करें- "पोस्ट" के बिना "पोस्ट" - ऑब्जेक्ट के बिना - उप-दस्तावेज़ के रूप में प्रोजेक्ट? निश्चित रूप से, मुझे कुछ श्रेणी से संबंधित सभी पदों को खोजने का विकल्प होना चाहिए।मोंगोस -

मैं जिस तरह से कल्पना कर सकता हूं उनमें से एक तरीका है "पोस्ट" - ऑब्जेक्ट obj_id से संबंधित सभी श्रेणियों में से स्टोर करना। इस तरह Smth:

var postSchema = mongoose.Schema({ 
    title: String, 
    description: String, 
    category: [ObjectId], 
    created_time: Number, 
}) 

और जोड़ने श्रेणी बाद में ...

post.category.push(obj_id); 

लेकिन यह वास्तव में एक नेवला-तरीका है? किस तरह सही है? धन्यवाद।

पीएस मैंने मोंगोज़ डॉक्स में जनसंख्या विधियों के बारे में भी पढ़ा है, क्या यह मेरे मामले में उपयोगी हो सकता है? अभी भी मेरे लिए पूरी तरह से स्पष्ट नहीं है यह क्या है।

उत्तर

16

Populate इसके लिए एक बेहतर टूल है क्योंकि आप पोस्ट और श्रेणियों के बीच कई रिश्तों को बना रहे हैं। उप-दस्तावेज उचित होते हैं जब वे विशेष रूप से मूल वस्तु से संबंधित होते हैं। तब

post.category.push(category1); 
post.save(callback); 

उन्हें प्रयोग क्वेरी दौरान rehydrate पॉप्युलेट:

var postSchema = mongoose.Schema({ 
    title: String, 
    description: String, 
    category: [{ type: Schema.Types.ObjectId, ref: 'Category' }], 
    created_time: Number, 
}); 

आप सरणी पर जोर दे रहा दस्तावेजों द्वारा श्रेणियां जोड़ सकते हैं:

Post.findOne({ title: 'Test' }) 
.populate('category') 
.exec(function (err, post) { 
    if (err) return handleError(err); 
    console.log(post.category); 
}); 
आप एक संदर्भ का उपयोग करने के अपने postSchema बदलना होगा
+0

धन्यवाद! 'Post.category.push (श्रेणी 1) में श्रेणी 1 होना चाहिए; '? क्या यह ऑब्जेक्ट आईडी के साथ स्ट्रिंग हो या अन्यथा smth? और एक और सवाल: "रीहाइड्रेट" क्या है? यह प्रक्रिया क्या करती है? मुझे इसकी ज़रूरत क्यों है? –

+0

यह एक वास्तविक श्रेणी मॉडल उदाहरण होना चाहिए। रीहाइड्रेट करके मेरा मतलब है कि आईडी के बजाय वास्तविक दस्तावेजों के संदर्भों को पॉप्युलेट करें। –