2011-12-05 16 views
7

मुझे लेखों का संग्रह (दिनांक के अनुसार आदेश - और कुछ और नहीं) की आवश्यकता है। Mongodb में ऐसा कुछ करने का मानक तरीका क्या है?मोंगोद में पेजिंग को कैसे कार्यान्वित करें?

मैं प्रदर्शन समस्याओं के कारण skip() विधि का उपयोग नहीं करने जा रहा हूं। न तो मैं $ पुश विधि का उपयोग करने की योजना बना रहा हूं। मैंने देखा सबसे नज़दीकी तरीका सीमा क्वेरी विधि है। लेकिन अगर किसी भी क्रमबद्ध वस्तुओं को हटा दिया जाता है तो ऐसा असफल हो जाता है।

+2

उत्तर स्वीकार करें और इस प्रश्न को बंद करें – beNerd

उत्तर

9

रेंज सॉर्टिंग आपके लिए अच्छी तरह से काम करनी चाहिए।

db.articles.find({}).sort({ date : -1 }).limit(10); 

इस के बाद आप पिछले आइटम का कहीं दुकान की तारीख की जरूरत है और अगले पेजिंग अनुरोध में आईडी का उपयोग करेगा:: सबसे पहले अनुरोध तिथि के अनुसार छाँटे पहले 10 आइटम ले जाएगा

db.articles.find({"date": {$lt: storedDateOfLastItem}}).sort({ date : -1 }).limit(10); 

तो, मैं लगता है कि यह होना चाहिए आपके लिए अच्छा काम करो। पृष्ठों की कुल गणना का अनुमान लगाने के लिए आपको count का उपयोग करने की आवश्यकता होगी।

लेकिन अगर किसी भी क्रमबद्ध वस्तुओं को हटा दिया जाता है तो ऐसा असफल लगता है।

यदि आप पृष्ठ # 1 से उदाहरण आलेख को हटा देंगे तो निश्चित तिथि के लिए यह अंतिम पृष्ठ # 2 को बदल दिया जाएगा क्योंकि अंतिम तिथि बदली जाएगी। मदों की इस गणना आप अनुमान लगा सकते हैं कि वर्तमान बचाया तारीख

db.articles.find({"date": {$gt: storedDateOfLastItem}}).sort({ date : -1 }).count() 

पहले था, तो इस गणना बदल गया था से बचने के लिए (मान लीजिए 2 articled हटा दिया गया था)। सी यू अगेन ऊपर अनुरोध के अंतिम आइटम से storedDateOfLastItem लेने और पेजिंग करना जारी रखने के अद्यतन storedDateOfLastItem

db.articles.find({"date": {$gt: storedDateOfLastItem}}).sort({ date : -1 }).take(2) 

की जरूरत है।

लेकिन मेरी राय सिर्फ इस पेजिंग को रखें क्योंकि यह अतिरिक्त तर्क के बिना है, क्योंकि मुझे लगता है कि आलेख हटाना दुर्लभ ऑपरेशन है।

MongoDB प्रलेखन से:

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

रेंज आधारित पेजिंग इंडेक्स का बेहतर उपयोग प्रदान करता है लेकिन आपको आसानी से किसी विशिष्ट पृष्ठ पर जाने की अनुमति नहीं देता है।

+0

तारीख प्रकारों का उपयोग कर रेंज प्रश्न/पृष्ठ मार्कर काम नहीं करते हैं क्योंकि आप उसी तारीख के साथ कई रिकॉर्ड के लिए असंगतता प्राप्त करेंगे। इसके बजाय मैं _id वैल्यू मार्कर का उपयोग करूंगा। यह सब ने कहा कि यह छोड़ने के लिए ओ (एन) प्रदर्शन से बचने के लिए सिर्फ हाउसकीपिंग का एक टन है। –

+0

अहह्ह मोंगोडब में इतनी थकाऊ है? मेरी इच्छा है कि 10gen से कोई हमें दिखाए कि वे पेजिंग की सिफारिश कैसे करते हैं। –

+0

@LulZilla: मेरे अपडेट को देखो, यह mongodb दस्तावेज से है। –

0

यदि आप एक इंडेक्स को सॉर्ट कर सकते हैं, तो "$ min" और "$ max" क्वेरी संशोधक या श्रेणी क्वेरी का उपयोग करके कुशल अंकन लागू किया जा सकता है। सुनिश्चित करें कि आपकी अनुक्रमणिका में अंत में एक अनूठी संपत्ति शामिल है (उदाहरण के लिए "_id")।

यदि आप किसी इंडेक्स पर सॉर्ट नहीं कर सकते हैं, तो आप परिणामों के पूर्ण सेट को प्री-प्रोसेस कर सकते हैं और क्रम में "_id" मानों की एक सूची रख सकते हैं। फिर आप उस सूची की एक श्रृंखला ले सकते हैं और "$ in" क्वेरी ऑपरेटर का उपयोग करके परिणामों का एक पृष्ठ खोज सकते हैं।

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