2011-01-08 9 views
1

couchdb보기의 색인을 생성 할 때 emit ([ "one", "two", " 3 "], 박사); 보기를 검색 할 때 순서가 중요하지만 때때로보기에서보기를 무시하고 싶습니다. 나는 두 가지 옵션을 생각해 보았다. 1. 규칙에 따라 내용을 사전 순으로 내보내고 찾고있는 것이 동일한 규칙을 사용하는지 확인하십시오. 2. 순서를 무시하고 해시를 기반으로 검색/검색하는 방식으로 해시를 처리합니다. (간단히 각각의 해시를 개별적으로 해시하고 해시를 "합"한 다음 mod를 사용하면 매우 쉽습니다.) 참고 : 권위있는 가이드 어딘가에이 내용이 포함될 수 있지만 확신 할 수 없었습니다.배열 요소의 순서가 무시되도록 배열 된 조회 키를 사용하여 CouchDB를 내 보냅니다.

답변

1

올바른 방법은 키에 대한 일반적인 순서를 결정한 다음이 순서대로 내 보내어이 주문을 적용하여 쿼리해야합니다. 그렇지 않으면 키의 모든 n (계승) 순열을 방출해야합니다 (n이 3보다 큰 경우 나쁠 수 있음)

+0

이것을 답으로 선택하면 다른 방법으로 제공 할 couchdb 기능을 아는 사람이 있는지 다시 확인합니다. – MatternPatching

+0

키에 "정렬되지 않은 배열 요소"를 허용하면 group_level http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Grouping을 사용할 수 없기 때문에 이것은 가장 적합합니다. –

0

CouchDB는 항상 배열 키를 순서대로 유지합니다. 보기의 일부로 모든 시퀀스 변형을 방출하는 것으로 생각하십니까?


function(doc) { 
    function computeAllKeyVariations(fromKey) { 
    // returns array of key arrays 
    } 
    var allKeys = computeAllKeyVariations(startingKey); 
    for (k in allKeys) { 
    emit(k, doc); // or emit(k, null) 
    } 
} 

사이드 참고 :의 라인을 따라 뭔가 당신은 대신 문서를 방출의 emit(['one','two','three'], null)를 사용하는 옵션이 있습니다. 이렇게하면 CouchDB가 전체 문서를 뷰 인덱스에 두 번 이상 저장하는 것을 피할 수있다. 이전과 같은 결과를 얻으려면 &include_docs=true

+0

이 접근법에 대한 우려는 뷰의 크기입니다. 방출 된 필드의 수는 디스크의 크기와 직접 관련이 있으며 조합 수는 (2^n) -1입니다. – majelbstoat

+0

사실, 여기에 내 대답을 받아들이는 것을 싫어 하겠지만 실제로는 n (계승)이됩니다. 나는 순서를 무시하고 정체성을 원하기 때문에 각 순열을 내야 할 것입니다. 나는 여기서 올바른 대답은 단지 순서를 만들고, 그 규칙을 기반으로 일관되게/질의를 내 보낸다라고 생각한다. 그러나 덜 루스의 공로로, 그는 하나 또는 두 가지 다른 방법과 같이 주요 순서를 나타낼 수있는 방법이 제한되어 있다고 생각할 수도 있습니다. 그럴 경우는 아니지만 모든 주문을 지원해야하므로 답변을 좋아합니다. – MatternPatching

+0

충분히 공정하게 작성하십시오. 당신의 예제에서 요구되는 6 개의 순열을 방출해도 키의 요소가 매우 자주 변경되지 않는다면 나에게는 매우 비싸지 않습니다. –