特に、集約フレームワーク自体については、乱数を生成するようなことを行うための利用可能な演算子がまだないため、実際にはネイティブな方法はありません。したがって、ソートするフィールドを投影できる可能性のある一致は、シフトするシード値がないために「真にランダム」ではありません。
より良いアプローチは、結果が返された後に結果を配列として「シャッフル」することです。さまざまな「シャッフル」実装があります。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の性質を利用しています。したがって、キーの先頭部分として乱数を含めると、常にランダムな順序の結果が得られます。