Specifiek voor het aggregatieraamwerk zelf is er niet echt een native manier omdat er nog geen beschikbare operator is om zoiets te doen als het genereren van een willekeurig getal. Dus welke match je ook zou kunnen projecteren voor een veld om op te sorteren, zou niet "echt willekeurig" zijn bij gebrek aan een verschuivende seed-waarde.
De betere benadering is om de resultaten als een array te "shufflen" nadat het resultaat is geretourneerd. Er zijn verschillende "shuffle"-implementaties, hier is er een voor JavaScript:
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;
}
Maar als je het eigenlijk hebt over het shuffelen van een groot aantal resultaten, zoals in een verzameling die is verkregen door het gebruik van de nieuwe $out
operator of welke verzameling dan ook, dan kun je "cheaten" door mapReduce te gebruiken.
db.collection.mapReduce(
function(){
var random = Math.floor( Math.random() * 100000 );
emit({ rand: random, id: this._id }, this );
},
function(){},
{ out: { replace: "newcollection" } }
);
Dit maakt gebruik van de aard van mapReduce doordat de sleutelwaarde altijd wordt gesorteerd. Dus door een willekeurig getal als het leidende deel van de sleutel op te nemen, krijgt u altijd een willekeurig geordend resultaat.