2010-09-21 59 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