0

我在尝试对 map reduce 进行排序时遇到问题。该集合具有附加用户的统计信息(如分数),因此它正在查找用户的最高分数。该部分有效,排序是然后对排行榜的这些结果进行排序。我已将这些函数放入 javascript 变量中并在 mongo 控制台中运行它们,一个简单的 find().sort({'value.max.value':-1}) 在生成的集合上工作正常,但我无法得到它在这里工作。(我的结果无序返回)。

$query->map('function() { 
    var x = { value : parseInt(this.value), _id : this._id, date : this.postDate };
    emit(this.user, { max : x }); 
}')
->reduce('function(key, vals) {
    var res = vals[0];
    for (var i=1; i<vals.length; i++) 
    {
        if(vals[i].max.value > res.max.value)
            res.max = vals[i].max;
    }
    return res;
}')
->sort('value.max.value', 'desc');
4

2 回答 2

1

当您执行->mapor->reduce调用时,Doctrine 会在内部"query mode""find"模式切换到"mapreduce"模式。

因此,您实际上是在执行MongoDB 文档中的mapReduce MongoDB 命令

这意味着您的sort()调用被转换为 mapReduce 命令中的排序属性,因此它只对输入文档进行排序。

要实际对输出进行排序,您有 2 个选项:

  • 使用out()查询中的方法将结果输出到临时集合中,然后使用排序从那里查询数据
  • 在php中对结果进行排序
于 2013-04-30T06:24:51.427 回答
0

map-reduce的sort应用于输入文档(如馈送到map),而不是结果。如果要对 map-reduce 的结果进行排序,则需要输出到集合,然后对该集合执行排序find查询(正如您已成功尝试的那样)。

于 2013-01-16T22:26:12.647 回答