Группировка с использованием Map и Reduce - PullRequest
1 голос
/ 20 августа 2011

У меня есть несколько документов с полем «статус» «Зеленый», «Красный», «Янтарный».

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

Функция карты:

function(doc) {
  emit(doc.status, doc);
}

Функция уменьшения: ???

Ответы [ 2 ]

5 голосов
/ 20 августа 2011

Это не та проблема, которую нужно решить за счет снижения;уменьшить в CouchDB для агрегации.

Если я правильно вас понимаю, вы хотите это;

Карта:

function(doc) {
  for (var i in doc.status) {
    emit(doc.status[i], null);
  }
}

Затем вы можете найти все документы статуса Зеленый с;

/_design/foo/_view/bar?key="Green"&include_docs=true

Это вернет список всех документов с таким статусом.Если вы хотите найти документы с более чем одним статусом в одном запросе, используйте http POST с телом этой формы:

{"keys":["Green", "Red"]}

HTH, B.

2 голосов
/ 20 августа 2011

Вообще говоря, вы не будете использовать функцию уменьшения для получения списка документов.Редукция предназначена для того, чтобы взять список и уменьшить его до одного значения.Фактически в любом случае существует верхний предел размера уменьшаемого значения, и использование целых документов вызовет ошибку reduce_overflow.Примерами сокращений являются числа, суммы, средние значения и т. Д. Придерживайтесь запроса карты, и ваши значения будут сопоставлены и отсортированы по значению status.

На другой, возможно, не связанной заметке, я бы невыдать документ с вашим видом.Вы можете просто использовать параметр запроса include_docs view и добиться того же эффекта, сохраняя при этом дисковое пространство.Компромисс заключается в том, что внутренне документ должен быть найден один за другим.(но так как они уже проиндексированы _id в любом случае, это обычно незначительная разница.

...