sql >> Database teknologi >  >> NoSQL >> MongoDB

mongo db aggregerede randomiser (shuffle) resultater

Specifikt for selve aggregeringsrammen er der ikke rigtig nogen indbygget måde, da der endnu ikke er nogen tilgængelig operatør til at gøre noget som at generere et tilfældigt tal. Så uanset hvilken match du kunne projicere et felt at sortere på, ville det ikke være "virkelig tilfældigt" på grund af mangel på en skiftende frøværdi.

Den bedre tilgang er at "shuffle" resultaterne som en matrix, efter at resultatet er returneret. Der er forskellige "shuffle"-implementeringer, her er en til 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 hvis du rent faktisk taler om at blande et stort antal resultater, såsom i en samling opnået ved brug af den nye $out operatør eller en hvilken som helst samling faktisk, så kan du "snyde" ved at bruge mapReduce.

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

Dette udnytter karakteren af ​​mapReduce ved, at nøgleværdien altid er sorteret. Så ved at inkludere et tilfældigt tal som den førende del af nøglen, vil du altid få et tilfældigt ordnet resultat.




  1. Doktrin ODM og design uden skema

  2. Redis binder til mere end én IP

  3. Finder skæringspunktet mellem to samlinger i MongoDb

  4. MapReduce ved hjælp af MongoDB Java Driver fejler med forkert type for BSONElement-påstand