MongoDB的Map / Reduce排序是否有效?

时间:2010-09-21 21:09:30

标签: mongodb mapreduce mongoid

如果使用以下内容

Analytic.collection.map_reduce(map, reduce, 
  :query => {:page => subclass_name}, 
  :sort => [[:pageviews, Mongo::DESCENDING]]).find.to_a

它不会按pageviews排序。或者,如果它是散列数组:

Analytic.collection.map_reduce(map, reduce, 
  :query => {:page => subclass_name}, 
  :sort => [{:pageviews => Mongo::DESCENDING}]).find.to_a

它也不起作用。我认为它必须是一个数组的原因是指定要排序的第一个字段,等等。我也尝试了一个平面数组而不是像上面第一个代码中列出的数组数组,它​​也没有工作

不工作吗?这是规范:http://api.mongodb.org/ruby/current/Mongo/Collection.html#map_reduce-instance_method

2 个答案:

答案 0 :(得分:5)

你想做什么?排序实际上只与限制一起使用:它在地图之前应用,因此您可以只使用MapReduce最新的20个项目。如果您尝试对结果进行排序,则可以对输出集合进行常规排序。

答案 1 :(得分:3)

好的,这有点棘手:

map_reduce()之后,返回Mongo::Collection个对象,但结构如下:

[{"_id":123.0,"value":{"pageviews":3621.0,"timeOnPage":206024.0}},
 {"_id":1320.0,"value":{"pageviews":6584.0,"timeOnPage":373195.0}},
   ...
]

所以要进行排序,必须是:

Analytic.collection.map_reduce(map, reduce, 
  :query => {:page => subclass_name}).find({}, 
    :sort => [['value.pageviews', Mongo::DESCENDING]])

请注意value.pageviews部分。