sql >> Database teknologi >  >> NoSQL >> MongoDB

Sortering af mongodb efter reddit-rangeringsalgoritme

Nå, du kan bruge 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 );

};

Og kør kortet Reduce (uden en reducering):

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

Og selvfølgelig forudsat at din "samling" har felterne til ups , downs og date . Selvfølgelig skal "ranglisten" udsendes på en måde, der er "unik", ellers har du brug for en "reducer" for at sortere resultaterne.

Men generelt set burde det gøre jobbet.



  1. Hvordan finder man mongodb-data og logfilers placering gennem kommando?

  2. node.js database

  3. MongoDB 3.2-godkendelse mislykkedes

  4. MongoDB $isNumber