Работает ли сортировка 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


person nonopolarity    schedule 21.09.2010    source источник


Ответы (2)


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

person kristina    schedule 21.09.2010
comment
Понимаю. возможно, в спецификации можно указать, что это перед картой, а не для окончательных результатов. Кроме того, зачем нам что-то сортировать для карты/уменьшать? В случаях, когда я вижу использование map/reduce, не имеет значения, в каком порядке находятся документы (записи). - person nonopolarity; 22.09.2010
comment
Это для агрегирования подмножества ваших данных. Допустим, вы хотите агрегировать последние 500 посещений вашего сайта. Вы можете сделать MapReduce для своей коллекции посетителей с сортировкой по дате и ограничением в 500. Без сортировки вы не сможете этого сделать. - person kristina; 23.09.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.

person nonopolarity    schedule 22.09.2010
comment
Это правда? В документации, похоже, указано, что сортировка применяется к коллекции, которую вы сопоставляете, до начала сопоставления. Я не вижу способа отсортировать результаты, но мне очень любопытно узнать, можно ли это сделать. - person JC Grubbs; 11.02.2012