2016-04-11 3 views
2

私は音楽のチャートに含まれるすべての曲を含むコレクションでmongodbを持っています。私は、私が欲しい曲の数と、何年から何曲を選んでいるのかを入力するスクリプトを書いています。ここまでは順調ですね。

しかし、返される曲には繰り返しの曲がないようにしようとしていますが、返されたときに各曲の_idの値を配列にプッシュしています集計の$ matchステージで$ ninを使用します。

var getSongs = function(number, year, db, callback) { 
    var collection = db.collection('songsList'); 
    var songIds = []; 
    var chartSongs = []; 
    for (var i = 0; i < number; i++) { 
    // Get one random document from the collection. 
    collection.aggregate([ 
    { 
     $match: { '_id': { '$nin': songIds }, 'songYear': year } 
    }, 
    { 
     $sample: { size: 1 } 
    } 
    ], 
    function(err, chart) { 
     songIds.push(chart[0]._id); 
     chartSongs.push(chart[0]); 
     if (songIds.length === number) { 
     callback(chartSongs); 
     } 
    }) 
    } 
}; 

ただし、正しい曲数が返されていますが、そのランダムリスト内で繰り返し再生されています。

誰でも提案をすることができますし、私にこれを行うより良い方法を提供することもできます。

答えて

2

これはいかがですか?

+0

私はどこから始めたのですか。残念ながら、それは私に結果が得られるとは思うが、MongoDBのドキュメントでは、 '$ sampleは同じ文書をその結果セットに複数回出力するかもしれない。'私は必要な結果の数に対して$サンプルを反復し、各結果の_idを$ ninに対してチェックするための配列にプッシュすることを考えましたが、それは私には当てはまりません。とにかくありがとう。 – ebenezer66

+0

@ ebenezer66書類の見積もりはどこで読んでいますか?そのリンクに[実際の行動](https://docs.mongodb.org/manual/reference/operator/aggregation/sample/#behavior)が記載されています。私はあなたが 'mapReduce'のドキュメンテーションと' reducer'関数の動作と混同していると思います。 –

+0

あなたが提供したリンクには、行動セクションの足元の大きな赤い警告ボックスがあります。しかし、私は、ほんのりとしたナンセンスのないサンプル・サイズを使っても、私には繰り返されない結果を与えてくれているようです。昨日1時間か2時間節約できたでしょうか。 – ebenezer66

関連する問題