Групиране с помощта на Map и Reduce

Имам някои документи с поле за „статус“ „Зелено“, „Червено“, „Кехлибарено“.

Сигурен съм, че е възможно да се използва MapReduce за създаване на групиран отговор, съдържащ три ключа (по един за всеки статус), всеки със стойност, съдържаща масив от всички документи с този ключ. Въпреки това се боря как да използвам функциите за повторно (намаляване).

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

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 харесва високи списъци, а не дебели списъци. Вече имате масив от зелени документи, ако зададете заявка ?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);
  }
}

След това можете да намерите всички документи със статус Зелено с;

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

Това ще върне списък на всички документи с това състояние. Ако искате да намерите документи с повече от едно състояние в една заявка, тогава използвайте http POST с тяло на тази форма;

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

HTH, Б.

person Robert Newson    schedule 20.08.2011