Я просмотрел кучу документов монго и не могу найти возможность перетасовать или рандомизировать содержимое результатов.
есть ли ?
Я просмотрел кучу документов монго и не могу найти возможность перетасовать или рандомизировать содержимое результатов.
есть ли ?
В частности, для самой структуры агрегации на самом деле нет собственного способа, поскольку пока нет доступного оператора, который мог бы сделать что-то вроде генерации случайного числа. Таким образом, любое совпадение, которое вы могли бы спроецировать в поле для сортировки, не было бы «действительно случайным» из-за отсутствия смещающегося начального значения.
Лучший подход состоит в том, чтобы «перетасовать» результаты в виде массива после того, как результат будет возвращен. Существуют различные реализации "перетасовки", вот одна из них для 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, заключающаяся в том, что значение ключа всегда сортируется. Таким образом, включив случайное число в качестве ведущей части ключа, вы всегда будете получать случайный упорядоченный результат.