विशेष रूप से एकत्रीकरण ढांचे के लिए वास्तव में कोई मूल तरीका नहीं है क्योंकि अभी तक कोई उपलब्ध ऑपरेटर नहीं है जैसे कि यादृच्छिक संख्या उत्पन्न करना। तो जो भी मैच आप संभावित रूप से किसी फ़ील्ड को सॉर्ट करने के लिए प्रोजेक्ट कर सकते हैं वह स्थानांतरण बीज मूल्य की कमी के लिए "वास्तव में यादृच्छिक" नहीं होगा।
परिणाम वापस आने के बाद परिणामों को सरणी के रूप में "फेरबदल" करना बेहतर तरीका है। विभिन्न "फेरबदल" कार्यान्वयन हैं, यहां जावास्क्रिप्ट के लिए एक है:
function shuffle(array) {
var currentIndex = array.length
, temporaryValue
, randomIndex
;
while (0 !== currentIndex) {
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
लेकिन अगर आप वास्तव में बड़ी संख्या में परिणामों को फेरबदल करने की बात कर रहे हैं जैसे कि नए $out
ऑपरेटर या वास्तव में कोई संग्रह, तो आप mapReduce का उपयोग करके "धोखा" दे सकते हैं।
db.collection.mapReduce(
function(){
var random = Math.floor( Math.random() * 100000 );
emit({ rand: random, id: this._id }, this );
},
function(){},
{ out: { replace: "newcollection" } }
);
यह mapReduce की प्रकृति का लाभ उठाता है, जिसमें मुख्य मूल्य हमेशा क्रमबद्ध होता है। तो एक यादृच्छिक संख्या को कुंजी के प्रमुख भाग के रूप में शामिल करने से आपको हमेशा एक यादृच्छिक क्रमित परिणाम प्राप्त होगा।