나는 여기에서하려고 노력하고있는 것이 불가능할지도 모른다라고 생각한다. 그러나 이것은 발사의 가치가있다.나는 불가능한 것을 시도하고 있을지도 모른다라고 생각한다 - 복잡한 Couchdb "JOIN"시나리오
두 개의 doc 유형이 있습니다 (Operator
및 Event
).
아래 예에서는 3 개의 키를 내 보냅니다.
[place_id, operator_id, zone_name]
operator_id
및 zone_name
은 두 문서에서 일반 필드입니다. 그래서 두 문서 유형을 조인하고 싶습니다.
첫 번째 emit()의 첫 번째 키는 place_id
이고 두 번째 emit()의 Event
doc._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() 함수는 오래 걸리고 오류가 발생합니다.
아마도이 문제를 두 개의 별도 쿼리로 나눠야 할 것입니다.하지만 실종 된 다른 접근 방법을 배우기를 바랍니다.
이 예에서 사용자는 ** 하나 ** 키를 방출합니다. 'emit()'** ** 항상 ** 한 번에 하나의 키와 하나의 값만 출력합니다. – JasonSmith