MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB के साथ फास्ट पेजिंग

अपने डेटा के माध्यम से पेजिंग MongoDB के साथ सबसे आम संचालन में से एक है। एक विशिष्ट परिदृश्य यह है कि आपके परिणामों को आपके UI में विखंडू में प्रदर्शित करने की आवश्यकता है। अगर आप अपने डेटा को बैच प्रोसेस कर रहे हैं, तो अपनी पेजिंग रणनीति को सही करना भी महत्वपूर्ण है ताकि आपकी डेटा प्रोसेसिंग स्केल हो सके।

आइए MongoDB में डेटा के माध्यम से पेज करने के विभिन्न तरीकों को देखने के लिए एक उदाहरण के माध्यम से चलते हैं। इस उदाहरण में, हमारे पास उपयोगकर्ता डेटा का एक CRM डेटाबेस है जिसे हमें एक बार में 10 उपयोगकर्ताओं के माध्यम से प्रदर्शित करने और प्रदर्शित करने की आवश्यकता है। तो वास्तव में, हमारे पृष्ठ का आकार 10 है। यहां हमारे उपयोगकर्ता दस्तावेज़ की संरचना है:

{
    _id,
    name,
    company,
    state
}

दृष्टिकोण 1:छोड़ें() और सीमा()

का उपयोग करना

MongoDB मूल रूप से स्किप () और लिमिट () कमांड का उपयोग करके पेजिंग ऑपरेशन का समर्थन करता है। स्किप (एन) निर्देश मोंगोडीबी को बताता है कि उसे 'एन' परिणाम छोड़ना चाहिए, और सीमा (एन) निर्देश मोंगोडीबी को निर्देश देता है कि उसे परिणाम की लंबाई को 'एन' परिणामों तक सीमित करना चाहिए। आमतौर पर, आप अपने कर्सर के साथ स्किप () और लिमिट () निर्देशों का उपयोग करेंगे - लेकिन परिदृश्य को स्पष्ट करने के लिए, हम कंसोल कमांड प्रदान करते हैं जो समान परिणाम प्राप्त करेंगे। साथ ही, कोड की संक्षिप्तता के लिए, सीमा-जांच कोड को भी बाहर रखा गया है:

//Page 1
db.users.find().limit (10)
//Page 2
db.users.find().skip(10).limit(10)
//Page 3
db.users.find().skip(20).limit(10)
........

तुम्हें नया तरीका मिल गया है। सामान्य तौर पर, पृष्ठ 'एन' को पुनः प्राप्त करने के लिए कोड इस तरह दिखता है:

db.users.find().skip(pagesize*(n-1)).limit(pagesize)

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

दृष्टिकोण 2:खोज () और सीमा () का उपयोग करना

पिछला दृष्टिकोण बहुत अच्छी तरह से स्केल नहीं करने का कारण स्किप () कमांड है, और इस खंड में लक्ष्य 'स्किप ()' कमांड का उपयोग किए बिना पेजिंग को लागू करना है। इसके लिए, हम संग्रहीत डेटा जैसे टाइमस्टैम्प या दस्तावेज़ में संग्रहीत आईडी में प्राकृतिक क्रम का लाभ उठाने जा रहे हैं। इस उदाहरण में, हम प्रत्येक दस्तावेज़ में संग्रहीत '_id' का उपयोग करने जा रहे हैं। '_id' एक MongoDB ऑब्जेक्टआईडी संरचना है जो एक 12-बाइट संरचना है जिसमें टाइमस्टैम्प, मशीनीकृत, प्रोसेसिड, काउंटर आदि शामिल हैं। समग्र विचार इस प्रकार है:

1. वर्तमान पृष्ठ में अंतिम दस्तावेज़ का _id प्राप्त करें
2. अगले पृष्ठ में इस "_id" से बड़े दस्तावेज़ों को पुनः प्राप्त करें

//Page 1
db.users.find().limit(pageSize);
//Find the id of the last document in this page
last_id = ...

//Page 2
users = db.users.find({'_id'> last_id}). limit(10);
//Update the last id with the id of the last document in this page
last_id = ...

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

इसके अतिरिक्त, यदि आप अपने डेटा को अपने पेजिंग के लिए किसी विशेष क्रम में क्रमबद्ध करना चाहते हैं, तो आप उपरोक्त तकनीक के साथ सॉर्ट () क्लॉज का भी उपयोग कर सकते हैं। यह सुनिश्चित करना महत्वपूर्ण है कि सॉर्ट प्रक्रिया सर्वोत्तम प्रदर्शन के लिए किसी इंडेक्स का लाभ उठा रही है। इसे निर्धारित करने के लिए आप अपनी क्वेरी में .explain() प्रत्यय का उपयोग कर सकते हैं:

users = db.users.find({'_id'> last_id}). sort(..).limit(10);
//Update the last id with the id of the last document in this page
last_id = ...

हमेशा की तरह यदि आपका कोई प्रश्न या टिप्पणी है तो कृपया बेझिझक हमसे [email protected] पर संपर्क करें।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगोडीबी को MySQL निर्यात

  2. वर्ग 'मोंगो क्लाइंट' नहीं मिला

  3. MongoDB Object.bsonSize ()

  4. MongoDB के साथ MapReduce वास्तव में, वास्तव में धीमा (समान डेटाबेस के लिए MySQL में 30 घंटे बनाम 20 मिनट)

  5. MongoDB में स्ट्रिंग को सबस्ट्रिंग या वर्णों की एक सरणी में विभाजित करें