Nou, je kunt mapReduce gebruiken:
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 );
};
En voer de mapReduce uit (zonder verloopstuk):
db.collection.mapReduce(
mapper,
function(){},
{
"out": { "inline": 1 }
}
)
En natuurlijk ervan uitgaande dat uw "verzameling" de velden heeft voor ups
, downs
en date
. Natuurlijk moeten de "ranglijsten" worden weergegeven op een manier die "uniek" is, anders heb je een "verkleiner" nodig om de resultaten te sorteren.
Maar over het algemeen zou dat het werk moeten doen.