Группировка с использованием Map и Reduce

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

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

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

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

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


person Alex    schedule 20.08.2011    source источник


Ответы (2)


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

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

person Dominic Barnes    schedule 20.08.2011
comment
+1. CouchDB любит длинные списки, а не толстые списки. У вас уже есть массив документов Green, если вы запросите ?reduce=false&key="Green". Это даст вам массив документов (плюс некоторые другие данные, которые вы можете игнорировать или удалить с помощью функции _list). - person JasonSmith; 21.08.2011
comment
?include_docs=true вводит состояние гонки, когда документ может измениться между моментом, когда Couch считывает строку представления с диска, и когда он возвращается к чтению документа с диска. Док может измениться за это короткое время. Но я думаю, что у подавляющего большинства приложений есть намного более важные вещи, о которых нужно беспокоиться. - person JasonSmith; 21.08.2011

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

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

Карта:

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

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

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

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

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

ХТХ, Б.

person Robert Newson    schedule 20.08.2011