Spécifiquement pour le cadre d'agrégation lui-même, il n'y a pas vraiment de moyen natif car il n'y a pas encore d'opérateur disponible pour faire quelque chose comme générer un nombre aléatoire. Ainsi, quelle que soit la correspondance sur laquelle vous pourriez éventuellement projeter un champ à trier, elle ne serait pas "vraiment aléatoire" faute d'une valeur de départ variable.
La meilleure approche consiste à "mélanger" les résultats sous forme de tableau après le retour du résultat. Il existe différentes implémentations "shuffle", en voici une pour 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;
}
Mais si vous parlez réellement de mélanger un grand nombre de résultats, comme dans une collection obtenue à partir de l'utilisation du nouveau $out
opérateur ou toute collection en fait, alors vous pouvez "tricher" en utilisant mapReduce.
db.collection.mapReduce(
function(){
var random = Math.floor( Math.random() * 100000 );
emit({ rand: random, id: this._id }, this );
},
function(){},
{ out: { replace: "newcollection" } }
);
Cela tire parti de la nature de mapReduce en ce sens que la valeur de la clé est toujours triée. Ainsi, en incluant un nombre aléatoire comme partie principale de la clé, vous obtiendrez toujours un résultat ordonné aléatoire.