MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

resultados do mongo db agregador randomize (shuffle)


Especificamente para a própria estrutura de agregação, não há realmente nenhuma maneira nativa, pois ainda não há operador disponível para fazer algo como gerar um número aleatório. Portanto, qualquer correspondência que você possa projetar em um campo para classificar não seria "verdadeiramente aleatória" por falta de um valor de semente variável.

A melhor abordagem é "embaralhar" os resultados como uma matriz após o resultado ser retornado. Existem várias implementações "shuffle", aqui está uma para 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;
}

Mas se você está realmente falando sobre embaralhar um grande número de resultados, como em uma coleção obtida pelo uso do novo $out operador ou qualquer coleção de fato, então você pode "trapacear" usando mapReduce.
db.collection.mapReduce(
    function(){
        var random = Math.floor( Math.random() * 100000 );
        emit({ rand: random, id: this._id }, this );
    },
    function(){},
    { out: { replace: "newcollection" } }
);

Isso tira proveito da natureza de mapReduce, pois o valor da chave é sempre classificado. Portanto, ao incluir um número aleatório como a parte principal da chave, você sempre obterá um resultado ordenado aleatório.