2010-09-21 52 views
2

如果下面是使用MongoDB的Map/Reduce排序工作吗?

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

回答

5

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

+0

我明白了。也许规范可以提到它在地图之前,而不是最终的结果。另外,为什么我们需要为map/reduce排序?在我看到map/reduce的用法的情况下,文档(记录)的顺序无关紧要。 – 2010-09-21 23:08:51

+0

它用于聚合数据的一个子集。假设您想要对您网站的最近500次访问进行汇总。你可以在你的访客集合上做一个MapReduce,按日期排序,限制为500.没有排序,你无法真正做到这一点。 – kristina 2010-09-22 21:01:20

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部分。

+0

这是真的吗?该文档似乎表明,该排序适用于映射器开始之前您映射的集合。我没有看到排序结果的方法,但我很好奇它是否可以完成。 – 2012-02-10 23:50:14