mapReduceを使用できます:
var mapper = function() {
function hot(ups,downs,date){
var score = ups - downs;
var order = log10(Math.max(Math.abs(score), 1));
var sign = score>0 ? 1 : score<0 ? -1 : 0;
var seconds = epochSeconds(date) - 1134028003;
var product = order + sign * seconds / 45000;
return Math.round(product*10000000)/10000000;
}
function log10(val){
return Math.log(val) / Math.LN10;
}
function epochSeconds(d){
return (d.getTime() - new Date(1970,1,1).getTime())/1000;
}
emit( hot(this.ups, this.downs, this.date), this );
};
そして、mapReduceを実行します(レデューサーなしで):
db.collection.mapReduce(
mapper,
function(){},
{
"out": { "inline": 1 }
}
)
そしてもちろん、あなたの「コレクション」にはups
のフィールドがあると仮定します 、downs
およびdate
。もちろん、「ランキング」は「ユニーク」な方法で発行する必要があります。そうでない場合は、結果を分類するために「レデューサー」が必要です。
しかし、一般的に言えば、それでうまくいくはずです。