Работает ли MongoDB Map / Reduce для сортировки? - PullRequest
2 голосов
/ 22 сентября 2010

Если используется следующее

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 ]

5 голосов
/ 22 сентября 2010

Что вы пытаетесь сделать? Сортировка действительно полезна только в сочетании с лимитом: она применяется перед картой, так что вы можете просто MapReduce последние 20 элементов или что-то. Если вы пытаетесь отсортировать результаты, вы можете просто выполнить обычную сортировку выходной коллекции.

3 голосов
/ 22 сентября 2010

Хорошо, это немного сложно:

После 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 часть.

...