2014-02-19 2 views
1

저는 CouchDB를 처음 사용하여 기본적인 예제를 구현하는 데 어려움을 겪고 있습니다. 나는 고객, 연락처, 주소라는 세 가지 문서를 가지고 있으며, 이들을 하나의 문서에 결합시키고 싶습니다.CouchDB 참고 문서

계정 전표

{ 
    "_id": "CST-1", 
    "_rev": "8-089da95f148b446bd3b33a3182de709f", 
    "name": "Customer", 
    "code": "CST-001", 
    "contact_Key": "CNT-001", 
    "address_Key": "ADD-001", 
    "type": "Customer" 
} 

연락 문서

{ 
     "_id": "CNT-001", 
     "_rev": "8-079da95f148b446bd3b33a3182de709g", 
     "fullname": "Happy Swan", 
     "type": "Contact" 
    } 

주소 문서

{ 
     "_id": "ADD-001", 
     "_rev": "8-179da95f148b446bd3b33a3182de709c", 
     "street1": "9 Glass View", 
     "street2": "Street 2", 
     "city": "USA", 
     "type": "Address" 
    } 

지도/조회 :

var map= function (doc) { 
     if (doc.type === 'Customer') { 
     emit(doc.id, { contact_Key: doc.contact_Key, address_Key: doc.address_Key }) 
     } 
    }; 

db.query({ map: map }, { include_docs: true }, function (err, res) { 

}); 

예를 들어 계정을 쿼리 할 때 한 문서에서 3 개의 모든 문서가 필요합니다.

예상 결과

{ 
     "_id": "CST-1", 
     "_rev": "8-089da95f148b446bd3b33a3182de709f", 
     "name": "Customer", 
     "code": "CST-001", 
     "contact_Key": "CNT-001", 
     "address_Key": "ADD-001", 
     "type": "Customer", 
     "Contact: { 
        "_id": "CNT-001", 
        "_rev": "8-079da95f148b446bd3b33a3182de709g", 
        "fullname": "Happy Swan", 
        "type": "Contact" 
     }", 
     "Address: { 
      "_id": "ADD-001", 
      "_rev": "8-179da95f148b446bd3b33a3182de709c", 
      "street1": "9 Glass View", 
      "street2": "Street 2", 
      "city": "USA", 
      "type": "Address" 
     }" 

    } 
+0

당신이 3 가입을 시도하고 있습니까 지도 내부의 문서/축소? 문서를 연결하는 것은 무엇입니까? 'contact_Key'와'Contact'를위한'_id'는 일치하지 않습니다. 또한'map' 함수는 고객 문서 만 출력합니다. – TheDude

+0

안녕하세요, 이드는 ID를 고정 시켰습니다. 예, 그렇다면 mal/reduce 내부에 가입하고 싶지만 결과를 얻는 방법을 모릅니다. – yaadgar

답변

0

내가 처음 계정 문서를 조회하고 자신의 ID를 알면 다음 다른 두 개의 쿼리보다 더 나은 솔루션을 볼 수 없습니다. 이 문서들 간의 유일한 연결은 계정 문서에 저장된 ID이므로 3 가지를 모두 동시에 얻으려면 내부적으로 DB가 두 가지 쿼리를 수행해야합니다. 먼저 계정 문서, 다른 두 사람. 그리고 설계 상 CouchDB는 한 번에 하나의 쿼리 만 수행합니다.

연락처 및 주소 문서에 계정 문서 ID를 저장 한 경우 list function을 사용하여 모두 하나로 통합 할 수 있습니다. 목록 기능

function(doc) { 
    if (doc.type === 'Customer') { 
    emit(doc._id, doc); 
    } 
    if (doc.type === 'Contact' || doc.type === 'Address') { 
    emit(doc.account_id, doc); 
    } 
} 

다음 :

먼저보기를 필요

function(head, req) { 
    var row, account, contact, address; 
    while (row = getRow()) { 
    if (row.value.type === 'Customer') { 
     account = row.value; 
    } else if (row.value.type === 'Contact') { 
     contact = row.value; 
    } else if (row.value.type === 'Address') { 
     address = row.value; 
    } 
    } 
    account['Contact'] = contact; 
    account['Address'] = address; 
    provides("json", function() { 
    return { 'json': account }; 
    }); 
} 

을 그리고 당신은 그것을 쿼리 것 :

GET /db/_design/foo/_list/the-list/the-view?key="CST-1" 
+0

Simon에게 감사드립니다. 두 가지 제안 모두 훌륭합니다. – yaadgar

관련 문제