2012-05-02 6 views
5

स्प्रिंग-डेटा के साथ, आप ऑब्जेक्ट को सहेजने के लिए कौन सा संग्रह निर्दिष्ट करने के लिए @Document एनोटेशन का उपयोग कर सकते हैं। मान लें कि मेरे पास दो वर्ग हैं, छात्र और शिक्षक, दोनों लोगों के संग्रह में बने रहे। जब मैं निम्नलिखित कोड निष्पादित करता हूं:वसंत-डेटा mongodb एक ही संग्रह में संग्रहीत कई कक्षाओं को पूछताछ

mongo.find(new Query(), Teacher.class); 

परिणाम में छात्र और शिक्षक दोनों शामिल हैं। स्प्रिंग-डेटा द्वारा बनाए गए डेटा को देखते हुए, प्रत्येक दस्तावेज़ में "_class" फ़ील्ड होता है जो इंगित करता है कि यह किस वर्ग से जारी है।

यह फ़ील्ड केवल शिक्षक को वापस करने के लिए फ़िल्टर के रूप में खोजने में उपयोग नहीं किया जाता है? मैं केवल यह कर के अलावा अन्य शिक्षक के लिए कैसे क्वेरी है:

mongo.find(new Query().addCriteria(where("_class").is(Teacher.class.getCanonicalName()), Teacher.class); 

उत्तर

1

यह कम या ज्यादा कैसे अपने संग्रह डिजाइन करने के लिए का सवाल है। चूंकि मोंगो को प्रकारों के बारे में कुछ भी पता नहीं है, इसलिए हमें एक दूसरे से दस्तावेज़ों को अलग करने में सक्षम होने के लिए अतिरिक्त मेटाडेटा जोड़ना होगा। इस प्रकार पूछताछ करते समय आपको इन बाधाओं को क्वेरी में भी जोड़ना होगा। ध्यान दें कि आप कुंजी DefaultMongoTypeMapper.DEFAULT_TYPE_KEY के माध्यम से देख सकते हैं।

mongo.find(new Query(Teacher.class), Teacher.class); 

यह अभी भी एक सा अजीब लगता है आप दो बार राज्य डोमेन वर्ग के लिए है कि (:

हम व्यक्त करने के लिए एक ही इस तरह एक दिया प्रकार के दस्तावेज़ प्राप्त करना चाहता है क्वेरी के लिए कुछ एपीआई जोड़ने के बारे में सोचा जो समझ में आता है यदि आप परिणामों को किसी दिए गए प्रकार के दस्तावेज़ों तक सीमित करना चाहते हैं लेकिन उन्हें एक अलग वर्ग पर मानचित्रित करें)। इसके अलावा हम केवल उन परिणामों को प्रतिबंधित कर सकते हैं जो लेते हैं, ठीक उसी प्रकार के रूप में टाइप स्ट्रिंग्स के रूप में संग्रहीत होते हैं और विरासत केवल तभी लागू की जा सकती है जब कक्षा पहले ही लोड हो चुकी हो। तो Person के साथ दस्तावेज़ों के लिए पूछताछ करते समय हमें सभी दस्तावेज़ों को पहले लोड करना होगा, प्रकार को देखने का प्रयास करें, प्रकार की जांच करें और संभवतः परिणाम को फेंक दें जो प्रदर्शन कारणों से उप-इष्टतम है।

एक और विकल्प सभी वर्गों को एक वर्ग को असाइन करने योग्य होगा (शायद Object को छोड़कर सभी इंटरफेस और सुपरक्लास) लेकिन इससे डेटा की मात्रा बहुत अधिक हो जाएगी। यह @Document एनोटेशन में ध्वज जोड़कर बदले में संपर्क किया जा सकता है।

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

+0

धन्यवाद ओलिवर, मैं एक टिकट अगर मैं एक अच्छा समाधान के साथ आने को बढ़ा देंगे। – ltfishie

+0

मोंगोडब जिरा के माध्यम से जाकर, मैं इस टिकट में आया https://jira.springsource.org/browse/DATAMONGO-128 जो 1.0.M3 के रूप में तय बाजार है। क्या यह अभी भी स्रोत में है? – ltfishie

+0

हां लेकिन यह आपके परिदृश्य को छू नहीं रहा है। टिकट एक ही संग्रह के अंदर 'व्यक्ति' और 'शिक्षक' को स्टोर करने में सक्षम होता है और इससे वस्तुओं से पूछताछ करने में सक्षम होता है और 'व्यक्ति' और 'शिक्षक' तत्काल (इसलिए आवश्यक प्रकार की जानकारी) प्राप्त करता है। यह वास्तव में "केवल पढ़ने 'शिक्षक' वस्तुओं" परिदृश्य में सुधार करने पर विचार नहीं करता है। –

1

इस इस प्रश्न के लिए सबसे अच्छा समाधान है:

query.restrict(Teacher.class,Teacher.class); 
+3

सुझाए गए उत्तर के बारे में अधिक जानकारी प्रदान करना ओपी – Hawk

+0

परफेक्ट, धन्यवाद के लिए बहुत उपयोगी होगा। –

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