sql >> Databasteknik >  >> NoSQL >> MongoDB

Sortera mongodb efter reddit rankingalgoritm

Du kan använda 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 );

};

Och kör kartanReduce (utan reducering):

db.collection.mapReduce(
    mapper,
    function(){},
    {
        "out": { "inline": 1 }
    }
)

Och givetvis förutsatt att din "samling" har fälten för ups , downs och date . Naturligtvis måste "rankingen" sändas ut på ett sätt som är "unikt" annars behöver du en "reducerare" för att reda ut resultaten.

Men generellt sett borde det göra jobbet.



  1. Uppdaterar ett rekord med mongoose

  2. Jag vill att min pre('save') mongoose-funktion endast ska fungera en gång

  3. MongoDB - sök efter datum och tid med C#-drivrutinen

  4. hur släpper man cachningen som används av Mongodb?