sql >> Base de Datos >  >> NoSQL >> MongoDB

mongo db agrega resultados aleatorios (shuffle)

Específicamente para el marco de agregación en sí mismo, no hay realmente ninguna forma nativa ya que todavía no hay un operador disponible para hacer algo como generar un número aleatorio. Por lo tanto, cualquier coincidencia que pueda proyectar en un campo para ordenar no sería "realmente aleatoria" por falta de un valor semilla cambiante.

El mejor enfoque es "mezclar" los resultados como una matriz después de que se devuelva el resultado. Hay varias implementaciones "shuffle", aquí hay una 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;
}

Pero si realmente está hablando de barajar una gran cantidad de resultados, como en una colección obtenida del uso del nuevo $out operador o cualquier colección de hecho, entonces puede "hacer trampa" usando mapReduce.

db.collection.mapReduce(
    function(){
        var random = Math.floor( Math.random() * 100000 );
        emit({ rand: random, id: this._id }, this );
    },
    function(){},
    { out: { replace: "newcollection" } }
);

Esto aprovecha la naturaleza de mapReduce en el sentido de que el valor clave siempre está ordenado. Entonces, al incluir un número aleatorio como la parte principal de la clave, siempre obtendrá un resultado ordenado aleatorio.