2011-01-24 54 views
3

我有一個問題,我有2個類型的文檔,其中之一是這樣的:CouchDB通過文檔域內連接?

{ 
    "type": "PageType", 
    "filename": "demo" 
    "content": "zzz" 
} 

,另外一個是這樣的:

{ 
    "type": "PageCommentType", 
    "refFilename": "demo" 
    "content": "some comment content" 
} 

我需要發出一個包含文件。點評字段,它是PageCommentType文檔的數組,它是我鏈接在條件PageType文檔的文件名== PageCommentType文檔的refFilename字段上的。

{ 
    "filename": "demo", 
    "comments": [{}, {}, {}] 
} 

任何人有任何建議如何實施它?

謝謝。

回答

4

您需要視圖整理。相同的視圖內發射兩者,使用filename作爲密鑰和類型標識符註釋和原始內容之間進行區分:

function(doc) { 
    if (doc.type == "PageType") emit([doc.filename,0],doc.content); 
    if (doc.type == "PageCommentType") emit[doc.refFilename,1],doc.content); 
} 

當尋找文檔demo及其評論,與startkey=["demo",0]endkey=["demo",1]運行查詢:你會得到頁面內容,然後是所有評論。

一旦所有數據你想要的,但它不是在正確的格式,你幾乎完成。只需編寫一個_list函數來讀取所有行並輸出包含所需結構/模式的最終JSON文檔。

+0

你的意思是第二個'emit'的'doc.comments'? –

+0

這兩行結果我管理,但它不是什麼即時通訊尋找。我想要聚合的文檔有評論屬性,這是一個類型爲PageCommentType的文檔的數組...在CouchDb的早期版本中,我記得有一些方法可以在map函數中調用map並以某種方式包裝它,但是我可以'不知道現在它是如何工作的... – Skitsanos

+0

有時候,如果我聽到「聚合」,這是從地圖/縮減視圖**減少**的線索。不幸的是,減少是不會在這裏工作的,因爲你正在積累數據而不是減少它。 (換句話說,你會得到一個縮小尺寸太大的錯誤。)我會用一些想法修改Victor的答案。 – JasonSmith