sql >> データベース >  >> NoSQL >> MongoDB

mongo db集計ランダム化(シャッフル)結果

    特に、集約フレームワーク自体については、乱数を生成するようなことを行うための利用可能な演算子がまだないため、実際にはネイティブな方法はありません。したがって、ソートするフィールドを投影できる可能性のある一致は、シフトするシード値がないために「真にランダム」ではありません。

    より良いアプローチは、結果が返された後に結果を配列として「シャッフル」することです。さまざまな「シャッフル」実装があります。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;
    }
    

    ただし、新しい $out 演算子または実際のコレクションの場合は、mapReduceを使用して「チート」できます。

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

    これは、キー値が常にソートされるというmapReduceの性質を利用しています。したがって、キーの先頭部分として乱数を含めると、常にランダムな順序の結果が得られます。




    1. Resque、Resque Server、RedisToGoとHeroku

    2. SaltStackを使用したMongoDBの自動化

    3. PHPMongoDB-カーソルオプションなしでのaggregateコマンドの使用は非推奨になりました。何?

    4. キーをフェッチする関数を指定してグループ化するにはどうすればよいですか?