वैसे आप 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
. बेशक "रैंकिंग" को इस तरह से उत्सर्जित करने की आवश्यकता है जो "अद्वितीय" है अन्यथा आपको परिणामों को छाँटने के लिए "रिड्यूसर" की आवश्यकता है।
लेकिन आम तौर पर बोलते हुए कि काम करना चाहिए।