2014-02-19 226 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裏面的文件/ reduce?什麼鏈接文檔? 'contact_Key'和Contact的'_id'不匹配。另外,您的「地圖」功能只能發送客戶文件。 – TheDude

+0

嗨,老兄我已經修好了ID,是的,我想加入然後內部馬爾/減少,但不知道如何得到結果。 – yaadgar

回答

0

我沒有看到比第一查詢帳戶文件,然後查詢其他兩個,一旦你知道它們的ID任何更好的解決方案。如果你仔細想一想,這是有道理的,因爲這些文件之間的唯一聯繫是存儲在賬戶文件中的ID,因此爲了同時獲得所有三個文件,在內部DB必須做兩個查詢:首先是賬戶文件,然後是另外兩個。通過設計,CouchDB一次只能執行一個查詢。

但是,如果您將帳戶doc 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

謝謝西蒙,你的建議都很棒。 – yaadgar