1

私は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はこの種の作業に適しているはずです。したがって、明らかに何か間違ったことをしているに違いありません。

ご協力いただきありがとうございます!

4

1 に答える 1

1

そして、私はあなたがMapReducingしているドキュメントの一部であると思いますか?

すべてのドキュメントに対してMapReduceを実行し、map関数で時間を決定し、それを発行するキーに追加すると、これらすべてを1つのMapReduceで実行できます。

于 2012-11-16T09:46:46.670 に答える