sql >> Database >  >> NoSQL >> MongoDB

mongo db aggregaat willekeurig (shuffle) resultaten

Specifiek voor het aggregatieraamwerk zelf is er niet echt een native manier omdat er nog geen beschikbare operator is om zoiets te doen als het genereren van een willekeurig getal. Dus welke match je ook zou kunnen projecteren voor een veld om op te sorteren, zou niet "echt willekeurig" zijn bij gebrek aan een verschuivende seed-waarde.

De betere benadering is om de resultaten als een array te "shufflen" nadat het resultaat is geretourneerd. Er zijn verschillende "shuffle"-implementaties, hier is er een voor 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;
}

Maar als je het eigenlijk hebt over het shuffelen van een groot aantal resultaten, zoals in een verzameling die is verkregen door het gebruik van de nieuwe $out operator of welke verzameling dan ook, dan kun je "cheaten" door mapReduce te gebruiken.

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

Dit maakt gebruik van de aard van mapReduce doordat de sleutelwaarde altijd wordt gesorteerd. Dus door een willekeurig getal als het leidende deel van de sleutel op te nemen, krijgt u altijd een willekeurig geordend resultaat.




  1. Verplichte velden uit Document in mongoengine halen?

  2. Wat is het exacte verschil tussen mongod en mongo's?

  3. Subschema's op mangoest zonder arrays

  4. hoe kan ik verbinding maken met een mongodb van Ruby-code?