2012-09-30 13 views
6

मेरे पास दस्तावेज़ों के साथ एक मोंगो संग्रह है। प्रत्येक दस्तावेज़ में एक फ़ील्ड है जो 0 या 1 है। मुझे डेटाबेस से यादृच्छिक नमूना 1000 रिकॉर्ड्स की आवश्यकता है और उन फ़ील्ड की संख्या गिनें जिनके पास 1 फ़ील्ड है। मुझे यह नमूना 1000 बार करने की आवश्यकता है। मैं यह कैसे करुं ?मोंगो से यादृच्छिक नमूनाकरण

+1

क्या आप उत्तर स्वीकार कर सकते हैं? –

+0

संभवतः डुप्लिकेट [मोंगोडीबी से यादृच्छिक रिकॉर्ड] (http://stackoverflow.com/questions/2824157/random-record-from-mongodb) –

+0

हे आदित्य, क्या आप कृपया एक उत्तर स्वीकार कर सकते हैं? – dalanmiller

उत्तर

1

यहाँ mongo खोल में एक उदाहरण है .. collname का एक संग्रह है, और thefield में ब्याज की एक मूल्य संभालने:

var total = db.collname.count(); 
var count = 0; 
var numSamples = 1000; 

for (i = 0; i < numSamples; i++) { 
    var random = Math.floor(Math.random()*total); 
    var doc = db.collname.find().skip(random).limit(1).next(); 
    if (doc.thefield) { 
     count += (doc.thefield == 1); 
    } 
} 
+0

यह एक अन्य प्रश्न का भी उत्तर देता है: एसक्यूएल के विपरीत, मोंगोडीबी के पास वास्तव में इसके लिए फ़ंक्शन में अंतर्निहित नहीं है।साथ ही यह छोड़ सकता है (... सकता है) बड़े यादृच्छिक मूल्यों के लिए परेशानी हो सकता है, हालांकि निर्भर करता है। – Sammaye

1

मैं संपादित करने वाले पर @Stennies मेरी टिप्पणी इस के साथ जवाब देने गया था, लेकिन आप भी कर सकते थे यदि आप बड़ी मात्रा में रिकॉर्ड छोड़ना चाहते हैं (यहां विशाल बात कर रहे हैं) तो एक विकल्प के रूप में एक अलग ऑटो वृद्धिशील आईडी इंडेक्स का उपयोग करें।

मैं एक और सवाल के लिए एक और जवाब लिखा इस तरह एक बहुत जहां कुछ एक संग्रह के n वें रिकॉर्ड खोजने की कोशिश कर रहा था:

php mongodb find nth entry in collection

मेरा उत्तर की दूसरी छमाही मूल रूप से एक संभावित विधि का वर्णन करता है जो आप इस समस्या से संपर्क कर सकते हैं। पाठ्यक्रम की यादृच्छिक पंक्ति प्राप्त करने के लिए आपको अभी भी 1000 बार लूप करना होगा।

12

मोंगोडीबी 3.0 और इससे पहले, मैं SQL दिनों से पुरानी चाल का उपयोग करता हूं (जो मुझे लगता है कि विकिपीडिया उनके यादृच्छिक पृष्ठ सुविधा के लिए उपयोग करता है)। मैं यादृच्छिक करने की आवश्यकता वाले प्रत्येक ऑब्जेक्ट में 0 और 1 के बीच एक यादृच्छिक संख्या संग्रहीत करता हूं, चलिए उस फ़ील्ड को "आर" कहते हैं। फिर आप "आर" पर एक इंडेक्स जोड़ते हैं।

db.coll.ensureIndex(r: 1); 

अब यादृच्छिक एक्स वस्तुओं को पाने के लिए, आप का उपयोग करें:

var startVal = Math.random(); 
db.coll.find({r: {$gt: startVal}}).sort({r: 1}).limit(x); 

यह आप एक ही खोज क्वेरी में यादृच्छिक वस्तुओं देता है। आपकी जरूरतों के आधार पर, यह अधिक हो सकता है, लेकिन यदि आप समय के साथ बहुत अधिक नमूना कर रहे हैं, तो यह आपके बैकएंड पर लोड किए बिना एक बहुत ही प्रभावी तरीका है।

+0

बढ़िया! बहुत अकलमंद! –

+0

सुरुचिपूर्ण समाधान! –

-1

यदि आप मोंगोएन्गिन का उपयोग कर रहे हैं, तो आप एक वृद्धिशील काउंटर उत्पन्न करने के लिए अनुक्रम फ़ील्ड का उपयोग कर सकते हैं।

class User(db.DynamicDocument): 
    counter = db.SequenceField(collection_name="user.counters") 

तो 100 का कहना है के एक यादृच्छिक सूची प्राप्त करने में, निम्न करें

def get_random_users(number_requested): 
    users_to_fetch = random.sample(range(1, User.objects.count() + 1), min(number_requested, User.objects.count())) 
    return User.objects(counter__in=users_to_fetch) 

जहां

get_random_users(100) 
5

कहेंगे जवाब देने के लिए आने वाले लोगों के लिए, आप अब का उपयोग करना चाहिए नया $sample एकत्रीकरण समारोह, 3.2 में नया।

https://docs.mongodb.org/manual/reference/operator/aggregation/sample/

db.collection_of_things.aggregate(
    [ { $sample: { size: 15 } } ] 
) 

फिर $group का उपयोग कर गणना प्राप्त करने में 0 और 1 s तक गिनती करने के लिए एक और कदम जोड़ें। Here is an example from the MongoDB docs

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