इसका उत्तर बहुत पहले दिया गया था और तब से, MongoDB बहुत विकसित हो गया है।
जैसा कि एक अन्य उत्तर में पोस्ट किया गया है, MongoDB अब संस्करण 3.2 के बाद से एकत्रीकरण ढांचे के भीतर नमूनाकरण का समर्थन करता है:
आप यह कैसे कर सकते हैं:
db.products.aggregate([{$sample: {size: 5}}]); // You want to get 5 docs
या:
db.products.aggregate([
{$match: {category:"Electronic Devices"}}, // filter the results
{$sample: {size: 5}} // You want to get 5 docs
]);
हालांकि, $sample ऑपरेटर के बारे में कुछ चेतावनियां हैं:
(नवंबर, 6ह, 2017 तक, जहां नवीनतम संस्करण 3.4 है) => यदि इनमें से कोई भी पूरा नहीं हुआ है:
- $नमूना पाइपलाइन का पहला चरण है
- N संग्रह में कुल दस्तावेज़ों के 5% से कम है
- संग्रह में 100 से अधिक दस्तावेज़ हैं
यदि उपरोक्त में से कोई भी शर्त पूरी नहीं होती है, तो $sample एक संग्रह स्कैन करता है और उसके बाद N दस्तावेज़ों का चयन करने के लिए एक यादृच्छिक सॉर्ट करता है।
पिछले उदाहरण की तरह $match
. के साथपुराना उत्तर
आप हमेशा दौड़ सकते हैं:
db.products.find({category:"Electronic Devices"}).skip(Math.random()*YOUR_COLLECTION_SIZE)
लेकिन आदेश यादृच्छिक नहीं होगा और आपको दो प्रश्नों की आवश्यकता होगी (Your_COLLECTION_SIZE प्राप्त करने के लिए एक गिनती) या अनुमान लगाएं कि यह कितना बड़ा है (यह लगभग 100 रिकॉर्ड है, लगभग 1000, लगभग 10000...)
आप सभी दस्तावेज़ों में एक यादृच्छिक संख्या और उस संख्या से क्वेरी के साथ एक फ़ील्ड भी जोड़ सकते हैं। यहां कमी यह होगी कि हर बार जब आप एक ही क्वेरी चलाते हैं तो आपको वही परिणाम मिलेंगे। इसे ठीक करने के लिए आप हमेशा लिमिट और स्किप या सॉर्ट के साथ भी खेल सकते हैं। हर बार जब आप कोई रिकॉर्ड प्राप्त करते हैं तो आप उन यादृच्छिक संख्याओं को भी अपडेट कर सकते हैं (अधिक प्रश्नों का अर्थ है)।
--मुझे नहीं पता कि आप किसी विशिष्ट भाषा के लिए Mongoose, Mondoid या सीधे Mongo Driver का उपयोग कर रहे हैं, इसलिए मैं mongo shell के बारे में सब कुछ लिखूंगा।
इस प्रकार, मान लें कि आपका उत्पाद रिकॉर्ड इस तरह दिखेगा:
{
_id: ObjectId("..."),
name: "Awesome Product",
category: "Electronic Devices",
}
और मैं उपयोग करने का सुझाव दूंगा:
{
_id: ObjectId("..."),
name: "Awesome Product",
category: "Electronic Devices",
_random_sample: Math.random()
}
तब आप यह कर सकते थे:
db.products.find({category:"Electronic Devices",_random_sample:{$gte:Math.random()}})
फिर, आप समय-समय पर चला सकते हैं ताकि आप समय-समय पर दस्तावेज़ के _random_sample फ़ील्ड को अपडेट कर सकें:
var your_query = {} //it would impact in your performance if there are a lot of records
your_query = {category: "Electronic Devices"} //Update
//upsert = false, multi = true
db.products.update(your_query,{$set:{_random_sample::Math.random()}},false,true)
या जब भी आप कुछ रिकॉर्ड पुनर्प्राप्त करते हैं तो आप उन सभी को या केवल कुछ को अपडेट कर सकते हैं (आपके द्वारा पुनर्प्राप्त किए गए कितने रिकॉर्ड के आधार पर)
for(var i = 0; i < records.length; i++){
var query = {_id: records[i]._id};
//upsert = false, multi = false
db.products.update(query,{$set:{_random_sample::Math.random()}},false,false);
}
संपादित करें
ध्यान रखें कि
db.products.update(your_query,{$set:{_random_sample::Math.random()}},false,true)
बहुत अच्छी तरह से काम नहीं करेगा क्योंकि यह आपकी क्वेरी से मेल खाने वाले हर उत्पाद को उसी . के साथ अपडेट करेगा यादृच्छिक संख्या। अंतिम तरीका बेहतर काम करता है (जैसे ही आप उन्हें पुनः प्राप्त करते हैं कुछ दस्तावेज़ों को अपडेट करना)