Bạn có thể sử dụng 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 );
};
Và chạy mapReduce (không có bộ giảm tốc):
db.collection.mapReduce(
mapper,
function(){},
{
"out": { "inline": 1 }
}
)
Và tất nhiên, giả sử rằng "bộ sưu tập" của bạn có các trường cho ups
, downs
và date
. Tất nhiên, "bảng xếp hạng" cần được phát ra theo cách "độc nhất", nếu không bạn cần một "bộ giảm tốc" để sắp xếp kết quả.
Nhưng nói chung, điều đó sẽ làm được việc.