2011-08-20 2 views
1

"상태"필드가 "녹색", "빨간색", "황색"인 문서가 있습니다.지도 및 축소를 사용하여 그룹화

MapReduce를 사용하여 각각의 상태에 하나씩 3 개의 키가 포함 된 그룹화 된 응답을 생성 할 수 있습니다. 각각의 키에는 해당 키가있는 모든 문서의 배열을 포함하는 값이 포함되어 있습니다. 그러나, 나는 re (reduce) 함수를 사용하는 방법에 고심하고있다.

지도 기능 :

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

기능 감소 : ???

답변

2

일반적으로 말하자면, reduce 함수를 사용하여 문서 목록을 가져올 수 없습니다. reduce는 목록을 가져 와서 하나의 값으로 줄이는 것을 의미합니다. 실제로 축소 값의 크기에는 상한이 있으며 전체 문서를 사용하면 reduce_overflow 오류가 발생합니다. 감소의 예로는 카운트, 합계, 평균 등이 있습니다.지도 쿼리를 사용하면 값이 대조되고 status 값으로 정렬됩니다.

다른 관련성이없는 메모에서보기로 문서를 내 보내지 않을 것입니다. include_docs 뷰 쿼리 매개 변수를 사용하고 프로세스에서 디스크 공간을 절약하면서 동일한 효과를 얻을 수 있습니다. 단점은 내부적으로 의사가 하나씩 검색해야한다는 것입니다. 그들은 어쨌든 _id 이미 색인하고 있기 때문에 (그러나, 보통 무시할 차이점

+1

+1. CouchDB는 뚱뚱한 목록이 아닌 키가 큰 목록을 좋아합니다. '? reduce = false & key = "Green"'를 쿼리하면 이미 "그린"문서 배열을 가지고 있습니다. 그러면 문서 배열 (무시할 수있는 다른 데이터 또는 _list 함수로 제거 할 수있는 데이터)이 제공됩니다. – JasonSmith

+1

? include_docs = true는 Couch가 디스크에서 뷰 행을 읽는 시간과 디스크에서 문서를 읽는 데 다시 돌아갈 시간 사이에 문서가 변경 될 수있는 경쟁 조건을 도입합니다. 의사는 짧은 시간에 변경 될 수 있습니다. 그러나 대다수의 애플리케이션에는 걱정할만한 것들이 많이 있다고 생각합니다. – JasonSmith

5

이 해결하기위한 것입니다 줄일 문제가 아니다.. 통합을위한 CouchDB를에 감소

내가 제대로 이해하는 경우 그런 다음에 상태 녹색의 모든 문서를 찾을 수 있습니다

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

,

:

지도, 당신이 원하는

그러면 해당 상태의 모든 문서 목록이 반환됩니다. 단일 쿼리에서 여러 상태의 문서를 찾으려면이 양식의 본문과 함께 http POST를 사용하십시오.

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

HTH, B.