Konkrétně pro samotný agregační rámec ve skutečnosti neexistuje žádný nativní způsob, protože zatím není k dispozici žádný operátor, který by udělal něco jako generování náhodného čísla. Takže jakákoliv shoda, kterou byste mohli promítnout do pole, podle kterého chcete třídit, by nebyla „skutečně náhodná“, protože chybí posunující se počáteční hodnota.
Lepší přístup je „zamíchat“ výsledky jako pole po vrácení výsledku. Existují různé implementace „shuffle“, zde je jedna pro 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;
}
Ale pokud ve skutečnosti mluvíte o promíchání velkého počtu výsledků, například v kolekci získané pomocí nového $out
operátora nebo jakékoli kolekce, pak můžete "podvádět" pomocí mapReduce.
db.collection.mapReduce(
function(){
var random = Math.floor( Math.random() * 100000 );
emit({ rand: random, id: this._id }, this );
},
function(){},
{ out: { replace: "newcollection" } }
);
To využívá povahu mapReduce v tom, že hodnota klíče je vždy seřazena. Zahrnutím náhodného čísla jako úvodní části klíče tedy vždy získáte náhodně uspořádaný výsledek.