2010-07-22 5 views
29

새로운 응용 프로그램에 CouchDB를 사용하려고하는데 여러 필드로 정렬하고 여러 필드로 필터링하는보기를 만들어야합니다. 다음은 예제 문서입니다. _id 및 _rev를 생략하여 입력 내용을 저장하지 않았습니다.동일한보기에서 CouchDB 정렬 및 필터링

{ 
    "title": "My Document", 
    "date": 1279816057, 
    "ranking": 5, 
    "category": "fun", 
    "tags": [ 
     "couchdb", 
     "technology" 
    ], 
} 

설명서를 통해 순위와 같은 필드별로 정렬하는보기를 쉽게 만들 수 있다는 것을 알게되었습니다.

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

나는 또한 내가 쉽게

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

http://127.0.0.1:5984/database/_design/filter/_view/filter?key=%22fun%22 

내 문제는 카테고리로 필드로 내가 모두 같은 시간에 이러한 일들의 무리를 할 필요가있다 필터링 할 수 있다는 것을 배웠다. 카테고리 및 태그를 기준으로 필터링하고 싶습니다. 필자는 "재미"범주의 문서와 "couchdb"태그 만 필터링 할 수 있어야합니다. 내림차순으로 정렬 한 다음 오름차순으로 정렬 한 다음 제목순으로 정렬하여 필터링 된 결과를 정렬하려고합니다.

모든 정렬 및 필터링을 결합한 하나의보기를 어떻게 만들 수 있습니까?

답변

45

키에 두 개 이상의 데이터를 내보내려면 Complex Keys을 읽어야합니다. 카테고리와 태그로 구성된 배열 인 키가 emit()이 될 가능성이 높습니다. 예를 들어 ...

function(doc) { 
    for(var i = 0; i < doc.tags.length; i++) 
    emit([doc.category, doc.tags[i]], doc); 
} 

지금 당신은 당신이 "CouchDB를"로 태그 재미 범주에있는 모든 항목을 얻을 것이다 ?key=["fun", "couchdb"]를 쿼리 할 때. 또는 재미있는 범주의 모든 항목을 태그에 관계없이 원하는 경우 범위 : ?startkey=["fun"]&endkey=["fun", {}]으로 쿼리 할 수 ​​있습니다. 상품에 여러 개의 태그가있는 경우 태그에 한 번만 문의하므로 결과에 여러 번 태그가 표시됩니다.

등급, 날짜 및 제목별로 정렬하는 추가 단계로 이동하려면 정수, 순위, 날짜 또는 제목 등 두 가지 요소를 배열에 추가하십시오. 지도 기능 당 두 번 이상 emit()을 사용할 수 있습니다. 예지도 기능은 ...

function(doc) { 
    for(var i = 0; i < doc.tags.length; i++) 
    { 
    emit([doc.category, doc.tags[i], 0, doc.ranking], doc); 
    emit([doc.category, doc.tags[i], 1, doc.title], doc); 
    emit([doc.category, doc.tags[i], 2, doc.date], doc); 
    } 
} 

지금 키 구조는 다음과 같습니다 ["category", "tag", 0 ... 2, rank/title/date] 당신은 기본적 물론 2에서 0 아래 순위의 모든, 제목 1에서, 그리고 날짜를 그룹화하고

, 당신 많은 양의 데이터를 전송하므로 디자인 문서에서 이러한 각 그룹을 개별 뷰로 분리하거나 문서의 _id 만 값 (emit([ ...], doc._id);)으로 되돌릴 수 있습니다.

은 "CouchDB를"태그 (오름차순)와 함께 "재미"카테고리에서 모든 것을 얻을 :

?startkey=["fun", "couchdb"]&endkey=["fun", "couchdb", {}, {}] 

는 "CouchDB를"태그와 함께 "재미"카테고리에있는 모든 가져 오기 (내림차순) :

?startkey=["fun", "couchdb", 0]&endkey=["fun", "couchdb", 0, {}]

:

?startkey=["fun", "couchdb", {}, {}]&endkey=["fun", "couchdb"]&descending=true 
는 CouchDB를 태그 (오름차순)와 재미 카테고리 만 순위를 얻기

은 (내림차순)은 "CouchDB를"태그와 함께 "재미"카테고리 만 순위를 가져 오기 :

?startkey=["fun", "couchdb", 0, {}]&endkey=["fun", "couchdb", 0]&descending=true 

도움이 되었기를 바랍니다. 복잡한 키가 실제로 슬라이스 및 다이 싱 데이터에서 Map/Reduce의 강력한 기능을 보여줍니다.

건배.

+0

감사합니다. 정말 도움이 되긴하지만 조금 더 도움이 필요합니다. 동일한 문서를 반복해서 발행하기 때문에 한 번만 각 문서를 제공 할 수 있습니까? – Apreche

+1

각 그룹을 각각의보기로 나눌 수 없다면 할 수 없습니다. 예를 들어,/_design/articles/_view/byRanking,/_design/articles/_view/byDate 등이 있습니다. 모든 것을이보기로 유지하려면 클라이언트에서 데이터를 관리해야합니다. 또는 문서의 _id 또는 null을 값으로 반환하는 것에 대한 설명을 따를 수 있습니다. 두 번째 호출을 통해 문서를 한 번 가져올 수 있습니다. –

+0

오, 잠깐. 나는 그것을 알아. 나는 네가 내가 원한 것을 오해 한 것 같아. 순위, 날짜 및 제목별로 동시에 정렬하고 싶습니다. SQL에서는 "오름차순, 날짜 내림차순, 제목 오름차순에 의한 정렬"이 될 것입니다. 하나만 내보내고 시작 키와 끝 키를 사용하여 필터링 할 수 있으며, 순서는 이미 완료됩니다. 감사! – Apreche

관련 문제