私はmongodbデータベースに数週間にわたる約10のmioドキュメントを収集しました。いくつかの簡単な統計を計算して、それらを出力できるようにしたいと思います。私が取得しようとしている統計は、1時間間隔での期間内の各ドキュメントの評価の平均です。
私がやろうとしていることを理解するには、次のsudoコードに従ってください。
var dateTimeStart;
var dateTimeEnd;
var distinctHoursBetweenDateTimes = getHours(dateTimeStart, dateTimeEnd);
var totalResult=[];
foreach( distinctHour in distinctHoursBetweenDateTimes )
tmpResult = mapreduce_getAverageRating( distinctHour, distinctHour +1 )
totalResult[distinctHour] = tmpResult;
return totalResult;
私のドキュメント構造は次のようなものです:{_ id、rating、topic、created_at}
Created_atは、統計を収集している日付です(挿入時刻と作成時刻は常に同じではありません)
created_atフィールドにインデックスを作成しました。
以下は私のmapreduceです:
map = function (){
emit( this.Topic , { 'total' : this.Rating , num : 1 } );
};
reduce = function (key, values){
var n = {'total' : 0, num : 0};
for ( var i=0; i<values.length; i++ ){
n.total += values[i].total;
n.num += values[i].num;
}
return n;
};
finalize = function(key, res){
res.avg = res.total / res.num;
return res;
};
おそらく、複数のmap-reduceステートメントを連続して実行する代わりに、mongoにさらに多くの作業を行わせることで、これをより効果的に実行できると確信しています。
この時点で、各map-reduceには約20〜25秒かかるため、数日間のすべての時間の統計をカウントすると、突然非常に長い時間がかかります。
私の印象では、mongoはこの種の作業に適しているはずです。したがって、明らかに何か間違ったことをしているに違いありません。
ご協力いただきありがとうございます!