2011-05-19 62 views
2

我在加入視圖中的某些文檔時遇到了問題。這裏是我的模式:類型爲「category」的文檔可以將一個嵌入的id數組存放到類型爲「page」的文檔中。兩者都有一個字段「名稱」。CouchDB Map函數 - 如何通過文檔ID獲取其他文檔的數據

我的文檔:

{ 
    "_id": "887c28dcf6dd8429d404d276b900b203", 
    "_rev": "3-c4d1e0c8378bb0081b5fe3522ee649a0", 
    "TYPE": "category", 
    "NAME": "Home", 
    "PAGES": [ 
     {"PAGE_ID": "887c28dcf6dd8429d404d276b900ad8f"}, 
     {"PAGE_ID": "887c28dcf6dd8429d404d276b900b203"}, 
     {"PAGE_ID": "887c28dcf6dd8429d404d276b900bae0"} 
    ] 
} 

{ 
    "_id": "887c28dcf6dd8429d404d276b9008c01", 
    "_rev": "1-afd54c654ae5afa56a3fbd7b1ba119d2", 
    "TYPE": "page", 
    "NAME": "Foo" 
} 

現在我想在這個地圖功能的觀點加入這些:

function(doc) { 
    if (doc.TYPE == "category") { 
    for (id in doc.PAGES) { 
     emit(doc.NAME, doc.PAGES[id].PAGE_ID); 
    } 
    } 
} 

代替PAGE_ID我想引用文檔的名稱。 這基本上是 the example from the CouchDB wiki,但它們不顯示地圖功能。那麼有什麼想法?

回答

4

您需要在輸出值的某個位置包含一個_id字段。之後,您使用include_docs=true,該視圖將包含鏈接文檔而不是源文檔。例如:

function(doc) { 
    if (doc.TYPE == "category") { 
     for (var x = 0; x < doc.PAGES.length; x++) { 
     emit(doc.NAME, { _id: doc.PAGES[x].PAGE_ID }); 
     } 
    } 
} 

當查詢該視圖,您添加到include_docs=true您的網址。並且您的視圖輸出將爲每行添加一個新字段,稱爲doc。通常,該字段將包含完整的源文檔。在這種情況下,它將包含您所指的鏈接文檔。

編輯順便說一句,你正在使用for...in循環不正確。 A for...in用於遍歷對象的屬性。您需要使用簡單的for循環來迭代像這樣的數組。

+0

嗨,現在我得到一個奇怪的結果:列表的第一頁得到解決,然後我得到兩個類別與未解決的頁面id然後第四頁(再次解決)。但我有兩個類別(第一個包含三個頁面,第二個僅包含一個)和四個頁面。 – prehfeldt 2011-05-19 14:18:17

+0

我禁不住注意到你的第二個'PAGE_ID'與文件本身的'_id'相同。哦,我剛剛注意到你的JS是錯誤的...(注意我的回答有所改變) – 2011-05-19 14:55:02

+0

哦,我用ID做了一個愚蠢的copy'n'paste錯誤,對不起。現在它可以工作,謝謝! – prehfeldt 2011-05-19 15:43:05