sql >> Databasteknik >  >> NoSQL >> MongoDB

mongo db sammanställ randomisera (shuffle) resultat

Specifikt för själva aggregeringsramverket finns det inte riktigt något naturligt sätt eftersom det ännu inte finns någon tillgänglig operatör att göra något som att generera ett slumptal. Så vilken matchning du än skulle kunna projicera ett fält att sortera på skulle inte vara "verkligen slumpmässig" i brist på ett skiftande frövärde.

Det bättre tillvägagångssättet är att "shuffla" resultaten som en array efter att resultatet har returnerats. Det finns olika "shuffle"-implementationer, här är en för 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;
}

Men om du faktiskt pratar om att blanda ett stort antal resultat, till exempel i en samling som erhållits från användningen av den nya $out operatör eller någon samling faktiskt, då kan du "fuska" genom att använda mapReduce.

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

Detta drar fördel av mapReduces natur genom att nyckelvärdet alltid sorteras. Så genom att inkludera ett slumpmässigt tal som den inledande delen av nyckeln får du alltid ett slumpmässigt ordnat resultat.




  1. Hur man organiserar många till många-relationer i MongoDB

  2. Node.js / Mongodb infoga återuppringning returnerar odefinierat

  3. Hur sorterar man i mangust?

  4. Visa data på webbsida hämtad från mongodb med node.js