2011-04-02 14 views
17

मुझे शायद कुछ याद आ रहा है क्योंकि मैं अभी भी इंस और मोंगोडीबी के बाहर सीख रहा हूं, लेकिन मुझे संग्रह को संग्रहित करने में सहायता चाहिए।MongoDB में रेंज क्वेरी का उपयोग करके पेजिनेशन कैसे करें?

मेरे पास एक संग्रह है जिसमें नामों की एक सूची है।

6oz
चिकन स्तन बीफ
चिकन स्तन के

निचला दौर 8oz
चिकन स्तन 8oz
चिकन स्तन 8oz
चिकन स्तन रैंडम
चिकन पैर
चिकन टेंडरलॉइन
चिकन जांघों
कोषेर नमक

मैंने "ProductName, _id" पर एक कंपाउंड इंडेक्स बनाया है।

db.ProductGuideItem.find({ ProductName: { $gt: "Chicken Breast 8oz" } }).sort({ProductName:1,_id:1}).limit(3); 

सूचना देखते हैं 3 "चिकन स्तन 8oz" आइटम:

मैं इस क्वेरी चलाते हैं।

अगर मैं उस क्वेरी मैं चलाने ...
चिकन स्तन रैंडम
चिकन पैर
चिकन टेंडरलॉइन

अगर मैं पेजिंग था और ऊपर से शुरू कर दिया। क्वेरी अन्य 2 "चिकन स्तन 8oz" चूक गई होगी।

तो प्रत्येक पृष्ठ केवल 3 आइटम हो सकते हैं और मैं यह देखने के लिए पेज 2 फिर मैं देखना चाहिए ..
8oz
8oz
चिकन स्तन रैंडम चिकन स्तन चिकन स्तन चाहते हैं।

लेकिन मैं नहीं हूं। यह आखिरी चिकन स्तन 8oz पर जा रहा है और इसके बजाय वहां से शुरू हो रहा है।

क्या इसके आसपास कोई रास्ता है?
अगर सूची विपरीत तरीके से हल की गई तो मैं यह कैसे करूं?

+1

अपने दावा क्या है से लिया जाता है? तीन लौटाई गई पंक्तियां पूरी तरह से ठीक हैं और आपकी क्वेरी से मेल खाते हैं या आप क्या उम्मीद करते हैं और क्यों? –

+0

सबसे पहले आराम करो। स्पष्ट रूप से मैं इसे सही ढंग से समझा नहीं रहा हूं। यदि प्रत्येक पृष्ठ में केवल 3 आइटम हो सकते हैं और मैं पेज 2 देखना चाहता हूं तो मुझे चिकन ब्रेस्ट 8oz, चिकन ब्रेस्ट 8oz, चिकन ब्रेस्ट रैंडम देखना चाहिए। पर मैं नहीं। यह आखिरी चिकन स्तन 8oz पर जा रहा है और इसके बजाय वहां से शुरू हो रहा है। –

+0

चूंकि मैं इसे गलत कर रहा हूं क्योंकि मैं सूचीबद्ध वस्तुओं के साथ पेज 2 कैसे प्राप्त करूं? –

उत्तर

27

संग्रह के बाद से मैं पेजिंग में डुप्लिकेट मान था, मुझे उत्पादनाम और आईडी पर एक कंपाउंड इंडेक्स बनाना पड़ा।

यौगिक सूचकांक

db.ProductGuideItem.ensureIndex({ ProductName:1, _id:1}); 

बनाएं यह मेरी समस्या हल।
संदर्भ: https://groups.google.com/d/msg/mongodb-user/3EZZIRJzW_A/oYH79npKZHkJ

मान लें कि आप इन मूल्यों है:

1 पृष्ठ

:

{a:1, b:1} 
{a:2, b:1} 
{a:2, b:2} 
{a:2, b:3} 
{a:3, b:1} 

तो तुम (2 के पृष्ठ आकार) रेंज आधारित पृष्ठांकन के लिए ऐसा करते हैं

find().sort({a:1, b:1}).limit(2) 
{a:1, b:1} 
{a:2, b:1} 

2 पृष्ठ

find().min({a:2, b:1}).sort({a:1, b:1}).skip(1).limit(2) 

{a:2, b:2} 
{a:2, b:3} 

3 पृष्ठ

find().min({a:2, b:3}).sort({a:1, b:1}).skip(1).limit(2) 
{a:3, b:1} 

यहाँ $ न्यूनतम/अधिकतम के लिये दस्तावेज हैं: http://www.mongodb.org/display/DOCS/min+and+max+Query+Specifiers

आप अपने संग्रह में डुप्लिकेट मानों नहीं है, तो, आपको न्यूनतम & अधिकतम या एक यौगिक अनुक्रमणिका बनाने की आवश्यकता नहीं है। आप केवल $ lt & $ gt का उपयोग कर सकते हैं।

+0

मुझे लगता है कि गैर-अद्वितीय क्षेत्रों पर श्रेणी आधारित पेजिंग के लिए यह एक दिलचस्प और उपयोगी परिप्रेक्ष्य है। हालांकि, मुझे नहीं लगता कि _id फ़ील्ड क्वेरी का हिस्सा है, तो आपके कंपाउंड इंडेक्स का अधिक उपयोग होता है। कारण यह है कि _id फ़ील्ड अद्वितीय है, और यह स्वचालित रूप से यौगिक अनुक्रमणिका के बजाय डिफ़ॉल्ट _id अनुक्रमणिका का उपयोग करने में सक्षम हो जाएगा। तर्क के लिए यहां देखें http://stackoverflow.com/questions/9598633/mongodb-unique-index-vs-compound-index –

+0

इस विधि का उपयोग करते समय आपको इंडेक्स '{ProductName: 1, _id का उपयोग करने के लिए mongodb को मजबूर करने की आवश्यकता है: 1} 'यदि आप नहीं करते हैं तो आपके परिणाम आदेश से बाहर होंगे। –

+0

यह पेजिनेशन के लिए उपयुक्त नहीं है जहां आप उपयोगकर्ता को एक पृष्ठांकन घटक (उदाहरण के लिए 'पृष्ठ 1, पृष्ठ 2, पृष्ठ 3, ..., पृष्ठ 10') प्रदर्शित करते हैं, क्योंकि आप यादृच्छिक रूप से' पृष्ठ # एन' लिंक पर क्लिक नहीं कर सकते , क्योंकि इसके लिए काम करने के लिए, पहले आपको 'पृष्ठ # एन -1' के लिए अंतिम 'ऑब्जेक्ट आईडी' की आवश्यकता होगी। यह Google+, फेसबुक या ट्विटर जैसे "अनंत स्क्रॉल" पृष्ठों के लिए अधिक उपयुक्त है। – Behrang

5

तुम बस कर्सर

cursor skip पर MongoDB दस्तावेज़ देखें पर छोड़ कॉल करने की आवश्यकता पृष्ठांकित "परिणाम" "यह दृष्टिकोण को लागू करने में उपयोगी हो सकता है"।

यह उदाहरण MongoDB के example

function printStudents(pageNumber, nPerPage) { 
    print("Page: " + pageNumber); 
    db.students.find().skip((pageNumber-1)*nPerPage).limit(nPerPage).forEach(function(student) { print(student.name + "<p>"); }); 
} 
संबंधित मुद्दे