MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

mongo db aggregiert randomisierte ( shuffle ) Ergebnisse

Speziell für das Aggregations-Framework selbst gibt es nicht wirklich einen nativen Weg, da es noch keinen verfügbaren Operator gibt, um so etwas wie das Generieren einer Zufallszahl zu tun. Welche Übereinstimmung Sie auch immer für ein Feld zum Sortieren projizieren könnten, wäre also nicht "wirklich zufällig", da kein sich ändernder Ausgangswert vorhanden ist.

Der bessere Ansatz besteht darin, die Ergebnisse als Array zu "mischen", nachdem das Ergebnis zurückgegeben wurde. Es gibt verschiedene "Shuffle"-Implementierungen, hier ist eine 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;
}

Aber wenn Sie tatsächlich über das Mischen einer großen Anzahl von Ergebnissen sprechen, wie z. B. in einer Sammlung, die durch die Verwendung des neuen $out -Operator oder eine beliebige Sammlung, dann können Sie mit mapReduce.

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

Dadurch wird die Eigenschaft von mapReduce ausgenutzt, dass der Schlüsselwert immer sortiert wird. Wenn Sie also eine Zufallszahl als führenden Teil des Schlüssels einfügen, erhalten Sie immer ein zufällig geordnetes Ergebnis.