C# 使用mongodb使用reddit算法对记录进行排序

C# 使用mongodb使用reddit算法对记录进行排序,c#,algorithm,mongodb,mapreduce,reddit,C#,Algorithm,Mongodb,Mapreduce,Reddit,我试图在我的应用程序中实现reddit算法作为一个排序选项,但我总是到处碰壁 我以这篇文章为指导开始了我的实现 我试着把它转换成c;下面是我的转换尝试 var map = new BsonJavaScript( @"function() { function hot(score, date){ var order = log10(Math.max(Math.abs(score), 1)); var sign = score

我试图在我的应用程序中实现reddit算法作为一个排序选项,但我总是到处碰壁

我以这篇文章为指导开始了我的实现

我试着把它转换成c;下面是我的转换尝试

var map = new BsonJavaScript(
    @"function() {

        function hot(score, date){
            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.VoteCount, this.CreatedAt), this );

    }"
);

var reduce = new BsonJavaScript(
    @"function(){}"
);

var finalize = new BsonJavaScript(
    @"{ 'out': { 'inline': 1 } }"
);

return db.Posts.MapReduce(new MapReduceArgs { MapFunction = map, ReduceFunction = reduce, FinalizeFunction = finalize }).GetResults();
他是我从实施中得到的结果

他是真实的数据集。

出于某种原因,该函数返回2个对象,而不是4个。 另外,我需要修改什么才能让函数返回整个post对象以及计算的分数

如果有人能帮助我,我将不胜感激:

提前感谢,,
Jean通过两次修改将其修复

这两种资源非常有用;

首先,我更改了要发射的参数。我正在动态地为post对象分配一个分数值,并在其上运行hot函数。然后我将emit的key参数作为对象key传递,将value参数作为带有score值的新post对象传递**密钥、值

this.score = hot(this.VoteCount, this.CreatedAt);
emit( this._id, this );
然后我改变了我得到结果的方式

db.Posts.MapReduce(new MapReduceArgs { MapFunction = map, ReduceFunction = reduce}).InlineResults
希望这对其他人有帮助:

当我有一些空闲时间时,我将使用这种计算分数的方法发布基准测试,以计算C中的分数

Alt实施/更新: 我切换到黑客新闻使用的更简单/更快的衰减算法,因为它仍然满足我的要求


首先:地图缩小…真的吗?别提了。你会如何实施它呢?也许完全在CI中考虑,当我开始工作的时候,你会更新一些基准。关键不一定是在实验室制作的基准测试场景中,而是在MongoDB中如何调用内部JS引擎。尤其是当你开始获得此页面的流量连接时。JS引擎根本不是为此而设计的,也不应该如此
Score = (P-1) / (T+2)^G

where,
P = points of an item (and -1 is to negate submitters vote)
T = time since submission (in hours)
G = Gravity, defaults to 1.8 in news.arc