Khusus untuk kerangka agregasi itu sendiri sebenarnya tidak ada cara asli karena belum ada operator yang tersedia untuk melakukan sesuatu seperti menghasilkan angka acak. Jadi, kecocokan apa pun yang dapat Anda proyeksikan di bidang yang akan diurutkan tidak akan "benar-benar acak" karena kurangnya nilai benih yang bergeser.
Pendekatan yang lebih baik adalah dengan "mengacak" hasil sebagai array setelah hasilnya dikembalikan. Ada berbagai implementasi "shuffle", berikut ini salah satunya untuk 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;
}
Tetapi jika Anda benar-benar berbicara tentang mengacak sejumlah besar hasil seperti dalam kumpulan yang diperoleh dari penggunaan $out
operator atau koleksi apa pun, maka Anda dapat "menipu" dengan menggunakan mapReduce.
db.collection.mapReduce(
function(){
var random = Math.floor( Math.random() * 100000 );
emit({ rand: random, id: this._id }, this );
},
function(){},
{ out: { replace: "newcollection" } }
);
Ini mengambil keuntungan dari sifat mapReduce di mana nilai kunci selalu diurutkan. Jadi dengan memasukkan angka acak sebagai bagian awal dari kunci maka Anda akan selalu mendapatkan hasil yang diurutkan secara acak.