mongo db совокупная рандомизация (перетасовка) результатов

Я просмотрел кучу документов монго и не могу найти возможность перетасовать или рандомизировать содержимое результатов.

есть ли ?


person M.Z.    schedule 11.04.2014    source источник
comment
Вероятно, вам лучше перетасовать его после того, как вы его получите, а не заставлять БД делать это за вас.   -  person Aboba    schedule 12.04.2014
comment
возможный дубликат случайной записи из MongoDB   -  person Will Shaver    schedule 12.04.2014
comment
но если вы используете -›limit(10) - вы можете получить рандом только из последних 10   -  person M.Z.    schedule 15.04.2014


Ответы (1)


В частности, для самой структуры агрегации на самом деле нет собственного способа, поскольку пока нет доступного оператора, который мог бы сделать что-то вроде генерации случайного числа. Таким образом, любое совпадение, которое вы могли бы спроецировать в поле для сортировки, не было бы «действительно случайным» из-за отсутствия смещающегося начального значения.

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

person Neil Lunn    schedule 12.04.2014