2013-06-09 3 views
53

मुझे एक ऐसा एप्लिकेशन लिखने की ज़रूरत है जिसके साथ मैं वसंत-डेटा और मोंगोडब का उपयोग कर जटिल प्रश्न कर सकता हूं। मैं मोंगो रिपोजिटरी का उपयोग करके शुरू कर रहा हूं लेकिन उदाहरण खोजने या सिंटैक्स को वास्तव में समझने के लिए जटिल प्रश्नों के साथ संघर्ष कर रहा हूं।स्प्रिंग डेटा के मोंगो टेम्पलेट और मोंगो रिपोजिटरी के बीच क्या अंतर है?

मैं प्रश्नों के बारे में इस तरह बात कर रहा हूँ:

@Repository 
public interface UserRepositoryInterface extends MongoRepository<User, String> { 
    List<User> findByEmailOrLastName(String email, String lastName); 
} 

या JSON आधारित प्रश्नों के उपयोग जो मैं परीक्षण और त्रुटि के द्वारा की कोशिश की क्योंकि मैं वाक्य रचना सही नहीं मिलता है। Mongodb प्रलेखन पढ़ने के बाद भी (गलत वाक्यविन्यास के कारण गैर-कामकाजी उदाहरण)।

@Repository 
public interface UserRepositoryInterface extends MongoRepository<User, String> { 
    @Query("'$or':[{'firstName':{'$regex':?0,'$options':'i'}},{'lastName':{'$regex':?0,'$options':'i'}}]") 
    List<User> findByEmailOrFirstnameOrLastnameLike(String searchText); 
} 

सभी दस्तावेज़ को पढ़ने के बाद ऐसा लगता है कि mongoTemplate कहीं बेहतर तो MongoRepository प्रलेखित है लगता है। मैं निम्नलिखित प्रलेखन की चर्चा करते हुए हूँ:

http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/reference.html

आप मुझे बता सकते हैं क्या और अधिक सुविधाजनक और शक्तिशाली उपयोग करने के लिए है? mongoTemplate या MongoRepository? क्या दोनों परिपक्व हैं या उनमें से एक को और अधिक सुविधाओं की कमी है?

उत्तर

95

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

जैसा कि रिपोजिटरी प्रोग्रामिंग मॉडल एकाधिक स्प्रिंग डेटा मॉड्यूल के लिए उपलब्ध है, आपको स्प्रिंग डेटा मोंगोडीबी reference docs के सामान्य अनुभाग में इसके बारे में अधिक गहन दस्तावेज मिलते हैं। ;

टी एल डॉ

हम आम तौर पर निम्नलिखित दृष्टिकोण की सिफारिश:

  1. भंडार सार के साथ शुरू और सिर्फ सरल प्रश्नों क्वेरी व्युत्पत्ति प्रणाली का उपयोग कर या मैन्युअल रूप से परिभाषित प्रश्नों घोषणा करते हैं।
  2. अधिक जटिल प्रश्नों के लिए, भंडार में मैन्युअल रूप से कार्यान्वित तरीकों को जोड़ें (यहां दस्तावेज़ के रूप में)। कार्यान्वयन के लिए MongoTemplate का उपयोग करें।

    1. अपने कस्टम कोड के लिए एक इंटरफेस को परिभाषित करें::

      interface CustomUserRepository { 
      
          List<User> yourCustomMethod(); 
      } 
      
    2. के लिए क्रियान्वयन जोड़े

    विवरण

    अपने उदाहरण के लिए इस कुछ इस तरह दिखेगा यह वर्ग सुनिश्चित करने के लिए नामकरण सम्मेलन का पालन करें और हम कर सकते हैं कक्षा पाएं

    class UserRepositoryImpl implements CustomUserRepository { 
    
        private final MongoOperations operations; 
    
        @Autowired 
        public UserRepositoryImpl(MongoOperations operations) { 
    
        Assert.notNull(operations, "MongoOperations must not be null!"); 
        this.operations = operations; 
        } 
    
        public List<User> yourCustomMethod() { 
        // custom implementation here 
        } 
    } 
    
  3. अब अपने आधार भंडार इंटरफ़ेस कस्टम एक का विस्तार करते हैं और बुनियादी सुविधाओं के अपने आप आपकी कस्टम कार्यान्वयन का उपयोग करेगा:

    interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository { 
    
    } 
    

इस तरह आप अनिवार्य रूप से पसंद मिलती है: सब कुछ है कि सिर्फ आसान घोषित करने के लिए UserRepository में जाता है, जो कुछ भी बेहतर ढंग से कार्यान्वित किया जाता है वह CustomUserRepository में जाता है। अनुकूलन विकल्प here दस्तावेज किए गए हैं।

+0

हाय ओलिवर, यह वास्तव में काम नहीं करता है। वसंत-डेटा कस्टम नाम से एक क्वेरी स्वत: उत्पन्न करने का प्रयास करता है। yourCustomMethod()। यह कहेंगे कि "आपका" डोमेन क्लास में मान्य फ़ील्ड नहीं है। मैंने मैनुअल का पालन किया और यह भी जांच की कि आप वसंत-डेटा-जेपीए-उदाहरण कैसे कर रहे हैं। कोई भाग्य नहीं। जैसे ही मैं रिपोजिटरी क्लास में कस्टम इंटरफ़ेस का विस्तार करता हूं, वसंत-डेटा हमेशा ऑटो-जेनरेट करने का प्रयास करता है। केवल अंतर यह है कि मैं मोंगो रिपोजिटरी का उपयोग कर रहा हूं, न कि क्रूड रिपोजिटरी क्योंकि मैं अब इटरेटर के साथ काम नहीं करना चाहता हूं। यदि आपको संकेत मिलेगा तो इसकी सराहना की जाएगी। –

+4

सबसे आम गलती कार्यान्वयन वर्ग को गलत नाम देना है: यदि आपके बेस रेपो इंटरफ़ेस को 'योर रिपोजिटरी' कहा जाता है, तो कार्यान्वयन वर्ग को 'YourRepositoryImpl' नाम दिया जाना चाहिए। क्या यह मामला है? यदि ऐसा है तो मुझे गिटहब पर एक नमूना प्रोजेक्ट को देखने में खुशी होगी या जैसे ... –

+1

हाय ओलिवर, आईएमएल क्लास को गलत माना गया था जैसा आपने माना है। मैंने नाम समायोजित किया और ऐसा लगता है कि यह अब काम कर रहा है। आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। इस तरह से विभिन्न तरह के क्वेरी विकल्पों का उपयोग करने में सक्षम होने के लिए यह वास्तव में अच्छा है। अच्छी तरह से सोचा! –

11

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

इसके बजाय, MongoTemplate मार्ग के साथ जाएं और अपनी खुद की डेटा एक्सेस परत बनाएं जो आपको स्प्रिंग प्रोग्रामर द्वारा सामना की जाने वाली कॉन्फ़िगरेशन दुःस्वप्न से मुक्त करती है। MongoTemplate वास्तव में ऐसे इंजीनियरों के लिए उद्धारक है जो अपने स्वयं के वर्गों और बातचीत को सुविधाजनक बनाते हैं क्योंकि बहुत लचीलापन है।

  1. एक MongoClientFactory वर्ग है कि आवेदन के स्तर पर चलाने के लिए और आप एक MongoClient वस्तु दे देंगे बनाएँ: संरचना कुछ इस तरह हो सकता है। आप इसे सिंगलटन के रूप में कार्यान्वित कर सकते हैं या एनम सिंगलटन का उपयोग कर सकते हैं (यह थ्रेड सुरक्षित है)
  2. डेटा एक्सेस बेस क्लास बनाएं जिससे आप प्रत्येक डोमेन ऑब्जेक्ट के लिए डेटा एक्सेस ऑब्जेक्ट प्राप्त कर सकें)। बेस क्लास एक मोंगो टेम्पलेट ऑब्जेक्ट बनाने के लिए एक विधि को कार्यान्वित कर सकता है, जिसे आप सभी डीबी एक्सेस
  3. प्रत्येक डोमेन ऑब्जेक्ट के लिए प्रत्येक डेटा एक्सेस क्लास मूल विधियों को कार्यान्वित कर सकते हैं या आप उन्हें बेस क्लास
  4. में लागू कर सकते हैं
  5. नियंत्रक विधियों को आवश्यकतानुसार डेटा एक्सेस कक्षाओं में विधियों को कॉल कर सकते हैं।
+0

हाय @ रमेशपा क्या मैं एक ही प्रोजेक्ट में मोंगो टेम्पलेट और रिपोजिटरी दोनों का उपयोग कर सकता हूं? .. क्या – Gauranga

+1

का उपयोग करना संभव है, लेकिन आप जो मोंगो टेम्पलेट लागू करते हैं, वह डीबी के साथ रिपोजिटरी द्वारा उपयोग किए गए कनेक्शन से अलग कनेक्शन होगा। परमाणुता एक मुद्दा हो सकता है। अगर आपके पास अनुक्रमिक आवश्यकताएं हैं तो मैं एक थ्रेड पर दो अलग-अलग कनेक्शनों का उपयोग करने की सलाह नहीं दूंगा – rameshpa

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