2012-06-15 15 views
12

दोस्तों के माध्यम से मोंगोडीबी में बड़े संग्रह पर इटरेट करें!वसंत-डेटा

मैं वसंत-डेटा के माध्यम से जावा परियोजना में मोंगोडीबी का उपयोग कर रहा हूं। मैं संग्रह में डेटा तक पहुंचने के लिए रिपोजिटरी इंटरफेस का उपयोग करता हूं। कुछ प्रसंस्करण के लिए मुझे संग्रह के सभी तत्वों को फिर से शुरू करने की आवश्यकता है। मैं भंडार की fetchAll विधि का उपयोग कर सकते हैं, लेकिन यह हमेशा ArrayList वापस आते हैं।

हालांकि, यह माना जाता है कि संग्रह में से एक बड़ा होगा - कम से कम 10 लाख तक प्रत्येक किलोबाइट रिकॉर्ड। मुझे लगता है कि मुझे ऐसे मामलों में fetchAll का उपयोग नहीं करना चाहिए, लेकिन मुझे कुछ इटरेटर (जो संग्रह को आंशिक रूप से प्राप्त करने की अनुमति दे सकता है) को वापस करने के लिए सुविधाजनक तरीके नहीं मिल सका, और न ही कॉलबैक के साथ सुविधाजनक तरीके।

मैंने पृष्ठों में ऐसे संग्रह पुनर्प्राप्त करने के लिए केवल समर्थन देखा है। मुझे आश्चर्य है कि इस तरह के संग्रह के साथ काम करने का यही एकमात्र तरीका है?

+0

आप 'सीमा()' कार्य करने के लिए समारोह सीमित करने के लिए उपयोग कर सकते हैं भागों में डेटा पुनर्प्राप्त करें –

+0

मैं उस ढांचे से परिचित नहीं हूं जिसका आप उपयोग कर रहे हैं, लेकिन अगर मुझे मोंगोडीबी के कर्सर के लिए कुछ रैपर नहीं है तो मुझे यह बहुत अजीब लगेगा। क्या आप सुनिश्चित हैं कि जो भी आप प्राप्त कर रहे हैं वह एक 'ऐरेलिस्ट' है, न कि एक कस्टम 'सूची' कार्यान्वयन जो एक कर्सर के चारों ओर लपेटता है? – thkala

+2

हां, निश्चित रूप से - मैंने अभी अपने खोज को लॉग किया है सभी()। GetClass() लगभग 3 लाख संग्रह के लिए और मुझे लगता है कि मैंने java.util.ArrayList देखा ... –

उत्तर

17

देर से प्रतिक्रिया, लेकिन शायद भविष्य में किसी की मदद करेगा ..) वसंत डेटा मोंगो डीबी कर्सर क्षमताओं को लपेटने के लिए कोई एपीआई प्रदान नहीं करता है। यह find विधियों के भीतर इसका उपयोग करता है, लेकिन हमेशा वस्तुओं की पूरी सूची लौटाता है। दस्तावेज़ आधार प्रति परिणामों को संभालने के लिए

do{ 
    page = repository.findAll(new PageRequest(pageNumber, pageLimit)); 
    pageNumber++; 

}while (!page.isLastPage()); 
+8

मैं बस बाद में भी झुकना चाहता था और कहता हूं डेटा के बड़े सेट, आपको पेजिंग एपीआई से भी दूर रहना चाहिए, क्योंकि इसे प्रत्येक पृष्ठ बनाने से पहले पूरे संग्रह को चलाना है। यह जल्दी महंगा हो जाता है। सीधे मोंगो एपीआई का उपयोग करने के लिए चिपक जाओ। –

+0

@ShawnBush आप इसके बारे में निश्चित हैं? – javadev

3

एक और तरीका है: विकल्प सीधे मोंगो एपीआई का उपयोग करने या स्प्रिंग डाटा पेजिंग एपीआई, कुछ ऐसा है जो की तरह उपयोग करने के लिए कर रहे हैं।

http://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/MongoTemplate.html#executeQuery-org.springframework.data.mongodb.core.query.Query-java.lang.String-org.springframework.data.mongodb.core.DocumentCallbackHandler-

2

चेक नई विधि:

 final int pageLimit = 300; 
     int pageNumber = 0; 
     Page<T> page = repository.findAll(new PageRequest(pageNumber, pageLimit)); 
     while (page.hasNextPage()) { 
      processPageContent(page.getContent()); 
      page = repository.findAll(new PageRequest(++pageNumber, pageLimit)); 
     } 
     // process last page 
     processPageContent(page.getContent()); 
7

उपयोग MongoTemplate :: धारा() शायद के रूप में सबसे उपयुक्त जावा आवरण DBCursor को

6

आप अभी भी संग्रह का उपयोग करने के mongoTemplate उपयोग कर सकते हैं और बस का उपयोग DBCursor:

 DBCollection collection = mongoTemplate.getCollection("boundary"); 
    DBCursor cursor = collection.find();   
    while(cursor.hasNext()){ 
     DBObject obj = cursor.next(); 
     Object object = obj.get("polygons"); 
     .. 
     ... 
    } 
0

आप इस तरह डीबीसीसरॉर तरीके से कोशिश कर सकते हैं:

DBObject query = new BasicDBObject(); //setup the query criteria 
    query.put("method", method); 
    query.put("ctime", (new BasicDBObject("$gte", bTime)).append("$lt", eTime)); 

    logger.debug("query: {}", query); 

    DBObject fields = new BasicDBObject(); //only get the needed fields. 
    fields.put("_id", 0); 
    fields.put("uId", 1); 
    fields.put("ctime", 1); 

    DBCursor dbCursor = mongoTemplate.getCollection("collectionName").find(query, fields); 

    while (dbCursor.hasNext()){ 
     DBObject object = dbCursor.next(); 
     logger.debug("object: {}", object); 
     //do something. 
    } 
1

स्ट्रीम कर्सर के रूप में:

@Query("{}") 
Stream<Alarm> findAllByCustomQueryAndStream(); 

तो के लिए डेटा की बड़ी राशि है जो आप उन्हें स्ट्रीम और स्मृति सीमा के बिना लाइन द्वारा लाइन संसाधित कर सकते हैं