如何使用Doctrine ODM对map / reduce的结果进行排序

时间:2013-01-16 22:15:17

标签: mongodb sorting symfony doctrine-odm odm

我在尝试按地图缩小后排序时遇到问题。该集合具有附加用户的统计数据(如分数),因此它找到了用户的最高分数。该部分有效,排序是对排行榜的结果进行排序。我把这些函数放到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');

2 个答案:

答案 0 :(得分:1)

当您进行->map->reduce来电时,Doctrine会在内部将"query mode""find"模式切换为"mapreduce"模式。

因此,您实际上正在执行mapReduce MongoDB command

中的MongoDB Documentation

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

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

  • 使用查询中的out()方法将结果输出到临时Collection,然后使用sort
  • 查询数据
  • 在php中对结果进行排序

答案 1 :(得分:0)

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