Конкретно за самата рамка за агрегиране всъщност няма никакъв естествен начин, тъй като все още няма наличен оператор, който да направи нещо като генериране на произволно число. Така че каквото и съвпадение, по което бихте могли да проектирате поле за сортиране, няма да бъде „наистина произволно“ поради липса на променяща се начална стойност.
По-добрият подход е да "разбъркате" резултатите като масив, след като резултатът бъде върнат. Има различни реализации на „разбъркване“, ето едно за 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;
}
Но ако всъщност говорите за разбъркване на голям брой резултати, като например в колекция, получена от използването на новия $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, тъй като стойността на ключа винаги е сортирана. Така че като включите произволно число като водеща част от ключа, винаги ще получавате произволен подреден резултат.