2013-07-29 8 views
9

मैं एक ऐसे परिदृश्य में भाग रहा हूं जहां मैं खुद से पूछ रहा हूं कि मुझे प्रत्येक इकाई (कक्षा में कई छात्र हैं) को अलग-अलग Meteor.collection ऑब्जेक्ट में रखना होगा या कक्षा ऑब्जेक्ट के अंदर छात्रों की एक सरणी एम्बेड करना होगा और एक meteor.collection कक्षा वस्तु।उल्का: किसी दस्तावेज़ के अंदर दस्तावेज़ एम्बेड करें या उन्हें प्रत्येक संग्रह ऑब्जेक्ट में अलग करें और उन्हें लिंक करें?

मेरी वृत्ति मुझे कक्षा और छात्रों को अपने स्वयं के उल्का में बदलने के लिए कहती है लेकिन मुझे यकीन नहीं है कि दो उल्का संग्रह वस्तुओं के बीच कई रिश्ते को कैसे स्थापित किया जाए।

क्या होगा यदि कई पारंपरिक हैं-कई-कई रिश्तों में काम करने के उल्का तरीके से अनुवाद किया जाता है?

मेरा प्रश्न इस तथ्य से उत्पन्न होता है कि। (कुल) समर्थित नहीं है, और यह महसूस किया जा रहा है कि एक मूल दस्तावेज़ के अंदर घोंसला और एम्बेडेड दस्तावेज़ों को पकड़ने के लिए रिकर्सिव लूप करने के बिना असंभव है जिसमें उल्का संग्रह मौजूद है (उदा। कक्षा) ।

उत्तर

16

अधिकतर समय अलग ऑब्जेक्ट प्रकारों को अलग-अलग संग्रह में रखने के लिए उपयोगी होता है।

Students.find({classroomId: "sdf8ad8asdj2jef"}); 

छात्र lof8gzanasd9a7j2n के साथ कक्षा प्राप्त करें::

Classrooms.insert({ 
    _id: "sdf8ad8asdj2jef", 
    name: "test classroom" 
}); 

Students.insert({ 
    _id: "lof8gzanasd9a7j2n", 
    name: "John" 
    classroomId: "sdf8ad8asdj2jef" 
}); 


कक्षा sdf8ad8asdj2jef में सभी छात्रों को प्राप्त करें:

मान लीजिए कि हम एक एक कई रिश्ते के लिए करते हैं

var student = Studtents.findOne("lof8gzanasd9a7j2n"); 
var classroom = Classrooms.find(student.classroomId); 


वस्तुओं लाना अलग संग्रह में विशेष रूप से उपयोगी है जब आप Meteor.publish() और Meteor.subscribe() उपयोग करने जा रहे है। Meteor.publish() बहुत आसान है जब आप केवल उस क्लाइंट को डेटा प्रकाशित करना चाहते हैं जो उपयोगकर्ता के लिए वास्तव में प्रासंगिक है।

निम्नलिखित केवल classroomId के साथ कमरे में मौजूद छात्रों को प्रकाशित करता है। (इसलिए क्लाइंट को सर्वर डेटाबेस से सभी छात्र ऑब्जेक्ट्स डाउनलोड करने की ज़रूरत नहीं है। केवल वे लोग जो प्रासंगिक हैं।)

Meteor.publish("students", function (classroomId) { 
    return Students.find({classroomId: classroomId}); 
}); 


कई संबंधों के कई भी है कि जटिल नहीं हैं:

0:

Classrooms.insert({ 
    _id: "sdf8ad8asdj2jef", 
    name: "test classroom" 
    studentIds: ["lof8gzanasd9a7j2n"] 
}); 

Students.insert({ 
    _id: "lof8gzanasd9a7j2n", 
    name: "John" 
    classroomIds: ["sdf8ad8asdj2jef"] 
}); 


कक्षा sdf8ad8asdj2jef में सभी छात्रों को मिलता है MongoDBs read operations पर

Classrooms.find({studentIds: "lof8gzanasd9a7j2n"}); 


अधिक जानकारी:

छात्र lof8gzanasd9a7j2n के साथ सभी कक्षाओं प्राप्त करें।

+0

कई से कई रिश्तों के लिए, क्या आप प्रत्येक ऑब्जेक्ट में विदेशी आईडी को संग्रहीत करने की सलाह देते हैं, या नक्शा के रूप में एक संग्रह के लिए, उदाहरण के लिए, रोस्टर, जिसमें स्कीमा {student_id: 123, classId: 234} है? –

+0

मेरे अनुभव से मैं प्रत्येक ऑब्जेक्ट में आईडी को स्टोर करने की अनुशंसा करता हूं, क्योंकि प्रश्न इस तरह से थोड़ा आसान होते हैं। लेकिन यह वास्तव में समग्र उपयोग के मामले पर निर्भर करता है। मैं दोनों अवसरों के लिए एक छोटा सा नमूना लागू करने और जटिलता जोड़ने, अपडेट करने, हटाने और क्वेरी की जांच करने की सिफारिश करता हूं। (सही स्कीमा चुनने से आपको बहुत सारे काम मिलेंगे।) यदि आप ग्राहक को भेजे गए डेटा को प्रतिबंधित करने के लिए Meteor.publish() और Meteor.subscribe() का उपयोग करते हैं, तो जांचें कि क्या आपके प्रतिबंध दोनों मामलों के साथ काम करते हैं या नहीं। –

+0

जवाब देने के लिए धन्यवाद। प्रकाशित और सदस्यता लें इसे संभालने के लिए बहुत आसान बना दिया! –

2

छात्रों और कक्षाओं के लिए अलग संग्रह अधिक सरल लगता है।

मुझे लगता है कि प्रत्येक छात्र दस्तावेज़ में केवल 'कक्षा' या 'कक्षा आईडी' फ़ील्ड रखने से आपको आवश्यक होने पर दो संग्रहों में शामिल होने की अनुमति मिल जाएगी।

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

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