स्किप () किसी इंडेक्स का प्रभावी ढंग से उपयोग नहीं करता है, इसलिए संग्रह के भीतर किसी भी फ़ील्ड पर इंडेक्स डालना व्यर्थ होगा।
चूंकि आप skip()
. करना चाहते हैं nth दस्तावेज़, यदि skip()
. का मान कम है (आपके सिस्टम पर निर्भर करता है लेकिन सामान्य रूप से पूर्ण संग्रह स्कैन पर 100K पंक्तियों के तहत) तो यह ठीक हो सकता है। समस्या यह है कि आम तौर पर ऐसा नहीं होता है। मोंगो, यहां तक कि एक इंडेक्स के साथ, इसे छोड़ने में सक्षम होने से पहले पूरे परिणाम सेट को स्कैन करने की आवश्यकता होगी जो एक पूर्ण संग्रह स्कैन को प्रेरित करेगा चाहे आपकी क्वेरी में कुछ भी हो।
यदि आप इसे अक्सर और यादृच्छिक तरीकों से करते हैं, तो बेहतर हो सकता है कि किसी अन्य संग्रह को findAndModify
के साथ जोड़कर एक वृद्धिशील आईडी का उपयोग किया जाए। एक सटीक दस्तावेज़ संख्या ( http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field ) तैयार करने के लिए।
हालाँकि यह समस्याएँ उत्पन्न करता है, आपको इस आईडी को विशेष रूप से तब रखना चाहिए जब डिलीट हो। इसका एक तरीका यह है कि दस्तावेज़ों को वास्तव में हटाने के बजाय उन्हें हटाए गए के रूप में चिह्नित किया जाए। जब आप सटीक दस्तावेज़ के लिए क्वेरी करते हैं तो आप हटाना छोड़ देते हैं और limit()
एक के द्वारा आप उस स्थिति में अगला निकटतम दस्तावेज़ प्राप्त कर सकते हैं जैसे:
$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1);
$cursor->next();
$doc = $cursor->current();