2015-01-31 5 views
2

두 개의 문서가 트리 구조로되어 있고 다른 하나는 첫 번째 문서와 연결되어 있습니다. Im은 fk와 pk에 의해이 2 개의 doc`s에 가입하려고 노력하고 있습니다. 나는 실제 결과를 얻지 못하고 모든 null 값을 표시합니다.Couchdb는 키를 사용하여 두 개의 문서를 합칩니다.

먼저 문서

{ 
    "name": "one", 
    "root": { 
      "level1" : { 
         "level2" : { 
           "level3" : { 
              "itemone": "Randomkey1", 
              "itemtwo": "Randomkey2 
              } 
           } 
        } 
     }, 
    "type": "firstdoc" 
} 

세컨드 의사

I`ve는 레벨 1 또는 2 또는 3 소정 키를 모두 나열하는 맵 함수를 작성
{ 
    "name" : "two", 
    "mapBy" : "Randomkey1", 
    "type" : "senconddoc 
} 

. 이제이 첫 번째 의사 및 두 번째 의사가 키를 사용하여 가입하고 싶습니다. 필자는 두 가지 방법을 시도 (첫째 : 임 모든 (루트, Randomkey), (docName 같은, Randomkey1)을 받고 있지만 어떤 가입 할 나던 임 (루트, docName 같은) 사람이 고정에

도움을 수 같은 결과를 찾고.

function(doc) { 
    if (doc.type === 'firstdoc' || doc.type === 'seconddoc') { 
     var rootObj = doc.Root; 
     for (var level1 in rootObj) { 

     var level2Obj = doc.Root[level1]; 

     for (var level2 in level2Obj) { 

      var keys = new Array(); 
      var level3Obj = level2Obj[level2]; 

      for (var i in level3Obj) { 

       var itemObj = level3Obj[i]; 

       for (var i in itemObj) { 
        keys.push(itemObj[i]); 

        emit(doc.name, [itemObj[i], 0]); 

        var firstDocName = doc.name; 

        //This is gives null values 
        if (doc.Type === 'senconddoc' && doc.mapBy === itemObj[i]) { 

         emit(firstDocName , doc); 
        } 
       } 
      } 



     } 


    } 
} 

//This just lists keys to me 
if (doc.type === 'senconddoc') { 

    emit([doc.mapBy, 1] , doc); 
} 
} 

답변

5

당신이 출력에의 _id있는 문서를 조인 시뮬레이션지도의 _id의 값이 문서의 실제 _id를 가리 키도록해야합니다. 그럼 당신은 include_docs=true를 사용할 수있다 관련 문서를 가져와야합니다. re : http://danielwertheim.se/couchdb-many-to-many-relations/

적용 할 수없는 경우 먼저 사용자 지정 키를 반환하여 두 단계 수동 조인을 만들 수 있습니다. 그런 다음 여러 개의 키가 지정된 상태에서 모든 문서보기에 대해 두 번째 쿼리를 만듭니다.

+0

Daniel, 두 번째 대안이 어떻게 작동하는지 이해하려고합니다. 두 개의 뷰를 작성한 다음 쿼리 하나를 작성하고 응답을 사용하여 클라이언트의 다른 뷰에 쿼리를 맞 춥니 다? –

+0

@AhmedFasih 아니요, 하나의보기를 사용하여 원하는 문서의 ID에 매핑되는 키를 반환 한 다음 해당 ID와 일치하는 all_docs 뷰 (시스템보기)에 대해 두 번째 쿼리를 실행합니다. 그러나 내가 소파에서 할 수 있으면 나는 조인으로부터 멀리 할 것이다 (더 이상 실제로 소파를 사용하지 않는다) – Daniel