2011-02-10 1 views
2

나는 여기에서하려고 노력하고있는 것이 불가능할지도 모른다라고 생각한다. 그러나 이것은 발사의 가치가있다.나는 불가능한 것을 시도하고 있을지도 모른다라고 생각한다 - 복잡한 Couchdb "JOIN"시나리오

두 개의 doc 유형이 있습니다 (OperatorEvent).

아래 예에서는 3 개의 키를 내 보냅니다.

[place_id, operator_id, zone_name]

operator_idzone_name은 두 문서에서 일반 필드입니다. 그래서 두 문서 유형을 조인하고 싶습니다.

첫 번째 emit()의 첫 번째 키는 place_id이고 두 번째 emit()의 Eventdoc._id입니다.

이렇게하면 시작 키를 place_id으로 구체화 할 수 있습니다. Event._id의 목록을 돌려 받고 싶습니다.

function(doc) { 
if(doc.doc_type == 'Operator') { 
for(var i in doc.zones) { 
    for(var ii in doc.zones[i].origs) { 
    if(doc.zones[i].origs[i]) 
     emit([doc.zones[i].origs[i], doc._id, doc.zones[i].name], null); 
    } 
} 
} else if (doc.doc_type == 'Event') { 
for(var i in doc.rates) { 
    if(doc.rates[i].zone) { 
    emit([0, doc.operator_id, doc.rates[i].zone], doc._id); 
    } 
} 
} 
} 

문제점은 두 번째 emit()에서 첫 번째 값인 0으로 조인되지 않습니다.

조인을 사용할 수있는 [operator_id, zone_name] 키를 내보내려고했지만, Event._id의 목록이 길어 지므로 reduce() 함수는 오래 걸리고 오류가 발생합니다.

아마도이 문제를 두 개의 별도 쿼리로 나눠야 할 것입니다.하지만 실종 된 다른 접근 방법을 배우기를 바랍니다.

+0

이 예에서 사용자는 ** 하나 ** 키를 방출합니다. 'emit()'** ** 항상 ** 한 번에 하나의 키와 하나의 값만 출력합니다. – JasonSmith

답변

1

emit()의 모든 것은 으로 분류됩니다. 종종 키는 정렬 순서가 좋은 배열입니다. 첫 번째 요소는 우선 순위가 가장 높고 두 번째 요소가 뒤에옵니다. 그러나 키가 배열 인 경우에도 여전히 한 가지이며 전체보기가 해당 키로 정렬됩니다 .

따라서 서로 다른 문서를 결합하려면보기에서 서로 인접하게 정렬해야합니다. 즉, emit() 키의 가장 왼쪽 요소를 공유해야합니다.

P. CouchDB를 사용하여 "JOIN"에 대해 이야기하는 것은 도움이되지 않습니다. 사람들이 때때로이 단어를 사용하기도합니다.