如何使用Doctrine ODM对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');

当您进行->map->reduce呼叫时,Doctrine内部将"query mode""find"模式切换到"mapreduce"模式。

所以你实际上是在做一个mapReduce MongoDB命令在MongoDB文档

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

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

  • 在查询中使用out()方法将结果输出到临时集合,然后使用sort
  • 从那里查询数据
  • 在php
  • 中排序结果

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

相关内容

  • 没有找到相关文章

最新更新