Как отобразить / уменьшить две коллекции MongoDB - PullRequest
0 голосов
/ 22 октября 2011

Я новичок в картографировании / сокращении и пытаюсь найти способ сбора следующих данных, используя карту / уменьшение, вместо этого выполняя мою мою (медленную) логику приложения:

У меня есть коллекция 'проектов'с отношением 1: n к коллекции «задач».Теперь я хотел бы получить массив результатов, который дает мне названия проектов, где первый - это проект с наибольшим количеством задач, а последний - проект с наименьшим количеством задач.

Или, что еще лучше, массив хешей, который также сообщает мне, сколько задач имеет каждый проект (при условии, что имя проекта уникально:

[project_1: 23, project_2: 42, project_3: 82]

Для карты я пробовал что-то вроде:

map = function () {
  emit(this.project_id, { count:1 });
}

и уменьшите:

reduce = function (key, values) {
  var sum = 0;
  values.forEach(function(doc){ sum += 1; });
  return { count:sum };
}

Я запустил это для своей коллекции задач:

var mr = db.tasks.mapReduce(map, reduce, { out: "results" });

Но я получаю важные результаты при запросах:

db[mr.result].find();

Я использую Mongoid на Rails и полностью теряюсь из-за этого. Может ли кто-нибудь указать мне правильное направление?

Заранее спасибо. Феликс

1 Ответ

2 голосов
/ 22 октября 2011

В целом выглядит правильно, но я замечаю, по крайней мере, одну проблему: шаг суммирования в функции сокращения должен быть

  values.forEach(function(doc){ sum += doc.count ; });

потому что функция может уменьшать значения, которые сами являются продуктом предыдущего шага сокращения и, следовательно, имеют значения счетчиков> 1.

Это общее упущение, упомянутое здесь: http://www.mongodb.org/display/DOCS/Troubleshooting+MapReduce

Надеюсь, это поможет!

...