sql >> Databáze >  >> NoSQL >> MongoDB

mongo db agregát randomize ( shuffle ) results

Konkrétně pro samotný agregační rámec ve skutečnosti neexistuje žádný nativní způsob, protože zatím není k dispozici žádný operátor, který by udělal něco jako generování náhodného čísla. Takže jakákoliv shoda, kterou byste mohli promítnout do pole, podle kterého chcete třídit, by nebyla „skutečně náhodná“, protože chybí posunující se počáteční hodnota.

Lepší přístup je „zamíchat“ výsledky jako pole po vrácení výsledku. Existují různé implementace „shuffle“, zde je jedna pro 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;
}

Ale pokud ve skutečnosti mluvíte o promíchání velkého počtu výsledků, například v kolekci získané pomocí nového $out operátora nebo jakékoli kolekce, pak můžete "podvádět" pomocí mapReduce.

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

To využívá povahu mapReduce v tom, že hodnota klíče je vždy seřazena. Zahrnutím náhodného čísla jako úvodní části klíče tedy vždy získáte náhodně uspořádaný výsledek.




  1. Požadavek GET je vždy implicitně nastaven na /(?:)/i – jak jej mohu změnit na „nedefinovaný“? - Druhá otázka na toto téma

  2. Jaký je rozdíl mezi Date.now() a Date.now v mongoose?

  3. Ovladač Promise a nodejs MongoDB

  4. Vlastní serializátor sbírky MongoDb