2011-11-09 4 views
7

मुझे यादृच्छिक रूप से संग्रह से एक दस्तावेज़ लेने की आवश्यकता है (वैकल्पिक रूप से - यादृच्छिक रूप से स्थित "विंडो" से लगातार दस्तावेजों की एक छोटी संख्या)। मुझे दो समाधान मिल गए हैं: 1 और 2। पहला अस्वीकार्य है क्योंकि मैं बड़े संग्रह आकार की अपेक्षा करता हूं और दस्तावेज़ आकार को कम करना चाहता हूं। दूसरा अप्रभावी लगता है (मुझे skip ऑपरेशन की जटिलता के बारे में निश्चित नहीं है)। और here कोई निर्दिष्ट सूचकांक के साथ किसी दस्तावेज़ को क्वेरी करने का उल्लेख पा सकता है, लेकिन मुझे नहीं पता कि यह कैसे करना है (मैं सी ++ ड्राइवर का उपयोग कर रहा हूं)।MongoDB: एक यादृच्छिक दस्तावेज़ से पूछने का सबसे प्रभावी तरीका क्या है?

क्या समस्या के अन्य समाधान हैं? सबसे कुशल कौन सा है?

+0

मोंगोडीबी टिकट ट्रैकर में एक संग्रह से यादृच्छिक आइटम प्राप्त करने के लिए एक [सुविधा अनुरोध] है [https://jira.mongodb.org/browse/SERVER-533)। यदि मूल रूप से लागू किया गया है, तो यह संभवतः सबसे कुशल विकल्प होगा। (यदि आप सुविधा चाहते हैं, तो इसे वोट दें।) –

+1

इस सवाल को स्टैक ओवरफ़्लो पर कई रूपों में पूछा गया है। सबसे लोकप्रिय सवाल है [मोंगोडीबी से यादृच्छिक रिकॉर्ड] (http://stackoverflow.com/questions/2824157/random-record-from-mongodb) - इसमें अच्छे प्रतिक्रियाएं हैं। उस ने कहा, मुझे लगता है कि सवाल के बारे में सोचने का सबसे अच्छा तरीका एक यादृच्छिक दस्तावेज़ प्राप्त करने के बारे में सोचना नहीं है, बल्कि, परिणाम सेट को यादृच्छिक बनाना। देखें [मोंगो में यादृच्छिक रूप से परिणाम सेट ऑर्डर करना] (http://stackoverflow.com/questions/8500266/ordering-a-result-set-randomly-in-mongo) इसके लिए। –

उत्तर

2

मैं एक बार एक ऐसी ही समस्या हुई। मेरे मामले में, मेरे पास मेरे दस्तावेज़ों पर एक तिथि संपत्ति थी। मुझे डेटासेट में सबसे पुरानी तारीख पता था, इसलिए मेरे आवेदन कोड में, मैं EARLIEST_DATE_IN_SET और अब की सीमा के भीतर एक यादृच्छिक तिथि उत्पन्न करूंगा और फिर तिथि संपत्ति पर एक जीटीई क्वेरी का उपयोग करके mongodb पूछता हूं और इसे केवल 1 परिणाम तक सीमित कर देता हूं।

एक छोटा सा मौका था कि यादृच्छिक तिथि डेटा सेट में उच्चतम तारीख से अधिक होगी, इसलिए मैंने उसके लिए आवेदन कोड में जिम्मेदार ठहराया।

दिनांक संपत्ति पर एक सूचकांक के साथ, यह एक सुपर फास्ट क्वेरी थी।

+0

धन्यवाद, मैं इस विकल्प के साथ गया था।मैंने अभी अपना आवेदन प्रोफाइल किया है, और मेरी इच्छा है कि सभी मोंगो एक्सेस आपकी विधि के साथ एक यादृच्छिक दस्तावेज़ चुनने के जितनी जल्दी हो :) –

2

ऐसा लगता है कि आप वहां 1 मोल्ड समाधान कर सकते हैं, (मान लें कि आपकी _id कुंजी ऑटो-इंक वैल्यू थी), फिर बस अपने रिकॉर्ड पर गिनती करें, और सी ++ में यादृच्छिक int के लिए ऊपरी सीमा के रूप में इसका उपयोग करें, फिर उस पंक्ति को पकड़ो।

इसी तरह, यदि आपके पास ऑटोइनक _आईडी कुंजी नहीं है, तो बस अपने परिणामों के साथ एक बनाएं .. एक आईएनटी के साथ एक अतिरिक्त फ़ील्ड होने से आपके दस्तावेज़ आकार में इतना कुछ नहीं जोड़ा जाना चाहिए।

कितनी जल्दी यहाँ एक जोड़ने के लिए आप एक स्वत: इंक क्षेत्र मोंगो बारे में बात करती नहीं है, तो:

Auto Inc Field.

+0

मुझे यकीन नहीं है कि मेरे पास autoinc _id है या नहीं। मैं इससे बचने की उम्मीद कर रहा था। मेरे दस्तावेज़ में आईडी फ़ील्ड है, और जब भी मैं एक नया दस्तावेज़ डालता हूं तो मैं उस फ़ील्ड के लिए 'sureIndex' कर रहा हूं। मैं मोंगो के लिए नया हूं, इसलिए मैं वास्तव में नहीं बता सकता। –

+0

क्या मेल खाने वाले इंडेक्स के साथ दस्तावेज़ को क्वेरी करना संभव है, लेकिन मैंने निर्दिष्ट किए गए सबसे नज़दीकी इंडेक्स के साथ? यह इंडेक्स द्वारा सामान्य क्वेरी के रूप में तेज़ होना चाहिए, और यह मेरी समस्या हल करता है। –

+0

मोंगो के आईडी के साथ यह बात यह है कि यदि आप डिफॉल्ट मोंगोइड (जो इसे उत्पन्न करता है) का उपयोग कर रहे हैं तो वे बीएसओएन ऑब्जेक्ट मॉडल का उपयोग कर रहे हैं: http://www.mongodb.org/display/DOCS/Object+IDs। प्रारंभिक दस्तावेज़ निर्माण पर _id के अपने स्वयं के सेट को बनाकर आप इसे ओवरराइड कर सकते हैं, बस यह पुष्टि करने की आवश्यकता है कि वे हमेशा अद्वितीय होते हैं। – Petrogad

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