मैप / रिड्यूस का उपयोग करके, आप निश्चित रूप से एक यादृच्छिक रिकॉर्ड प्राप्त कर सकते हैं, बस जरूरी नहीं कि परिणामी फ़िल्टर किए गए संग्रह के आकार के आधार पर आपके साथ काम करना समाप्त हो।
मैंने 50,000 दस्तावेज़ों के साथ इस पद्धति का परीक्षण किया है (फ़िल्टर इसे लगभग 30,000 तक कम कर देता है), और यह एक इंटेल i3 पर लगभग 400ms में 16GB RAM और एक SATA3 HDD के साथ निष्पादित करता है ...
db.toc_content.mapReduce(
/* map function */
function() { emit( 1, this._id ); },
/* reduce function */
function(k,v) {
var r = Math.floor((Math.random()*v.length));
return v[r];
},
/* options */
{
out: { inline: 1 },
/* Filter the collection to "A"ctive documents */
query: { status: "A" }
}
);
मानचित्र फ़ंक्शन क्वेरी से मेल खाने वाले सभी दस्तावेज़ों की आईडी का एक सरणी बनाता है। मेरे मामले में मैंने 50,000 संभावित दस्तावेजों में से लगभग 30,000 के साथ इसका परीक्षण किया।
रिड्यूस फ़ंक्शन केवल सरणी में 0 और आइटमों की संख्या (-1) के बीच एक यादृच्छिक पूर्णांक चुनता है, और उसके बाद __id देता है को सरणी से ।
400ms एक लंबे समय की तरह लगता है, और यह वास्तव में है, अगर आपके पास पचास हजार के बजाय पचास लाख रिकॉर्ड थे, तो यह ओवरहेड को उस बिंदु तक बढ़ा सकता है जहां यह बहु-उपयोगकर्ता स्थितियों में अनुपयोगी हो जाता है।
इस सुविधा को कोर में शामिल करने के लिए MongoDB के लिए एक खुला मुद्दा है ... https://jira.mongodb.org/browse/SERVER-533
यदि यह "यादृच्छिक" चयन आईडी में किसी सरणी को इकट्ठा करने और फिर एक का चयन करने के बजाय एक इंडेक्स-लुकअप में बनाया गया था, तो यह अविश्वसनीय रूप से मदद करेगा। (इसे वोट दें)