Ockonal
@Ockonal

Как правильно сделать лимит в mapreduce?

Здравствуйте, использую mongodb + встроенную реализацию mapreduce.
Данные выглядят таким образом:
{ obj: integer, likes: integer}, ...

Мне нужно получить по 2 документа на каждый уникальный тип obj с максимальным количеством likes.

Допустим есть такие данные:
1=>124, 1=>20, 1=>70, 1=>150,
  3 => 500, 3=>499, 3=>0


В результате мне нужно получить:
1=>150, 1=>124,
3=>500, 3=>499


Вот так выглядит map-функция:
mapFunc = Code('function() { 
   emit(this.gid, { likes: this.likes, obj : this._id });
}')


И reduce:
reduceFunc = Code('function(key, values) { 
   var likesCount = -1;
   var selectedId = -1;
   values.forEach(function(value) {
      if (value["likes"] > likesCount)
      {
         likesCount = value["likes"];
         selectedId = value["obj"];
      }
   });
   return {likes: likesCount, obj: selectedId};
}')


По сути, этот пример вернет мне то, что нужно, но по 1 записи на уникальный obj, этого можно было бы добиться и обычным aggregation framework'ом.

Никак не могу понять, как в таком подходе взять 2 последние записи с максимальным количеством likes.
  • Вопрос задан
  • 2386 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы