sql >> Base de Datos >  >> NoSQL >> MongoDB

Ordenar mongodb por el algoritmo de clasificación de reddit

Bueno, puedes usar 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 );

};

Y luego ejecute mapReduce (sin un reductor):

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

Y, por supuesto, suponiendo que su "colección" tenga los campos para ups , downs y date . Por supuesto, las "clasificaciones" deben emitirse de una manera que sea "única", de lo contrario, necesitará un "reductor" para clasificar los resultados.

Pero en términos generales eso debería hacer el trabajo.