2011-11-16 69 views
2

我正在做一個簡單的協作功能列表。 基本上用戶說他想共享一組待辦事項。是CouchDB的一個很好的契合?

結構是一個項目屬於一個組,並且該組可供一組用戶使用。 現在要獲取特定用戶的待辦事項列表,我需要找出用戶也可以訪問的所有組。

所以基本結構看起來有點像這樣:

用戶 - 組 - 項目

我要的是給一個用戶ID我想要的物品爲所有用戶具有訪問權限的組。

從我的早期實驗來看,用期望的輸出產生視圖似乎有些問題。 CouchDB是否合適,還是應該尋找其他數據庫來處理?

回答

0

如果我理解正確,每個組都有一個用戶列表和一個項目列表。然後,對於每個組,可以發出針對每個(用戶,項目)的行一對:

emit(userId, { _id: itemId }); 

key="userId"查詢視圖,應該給正確的結果。

例如,如果一組文檔的結構如下:

{ 
    "_id": "Group_gid1", 
    "userIds": ["User_uid1", ..., "User_uidN"], 
    "itemIds": ["Item_iid1", ..., "Item_iidM"] 
} 

你的地圖功能可以是這樣的(未測試!):

function (doc) { 
    var i, ii, userId, j, jj, itemId, ids = doc._id.split('_'); 
    if (ids[0] === 'Group' && doc.userIds && doc.itemIds) { 
    for(i = 0, ii = doc.userIds.length, jj = doc.itemIds.length; i < ii; i += 1) { 
     userId = doc.userIds[i]; 
     for(j = 0; j < jj; j += 1) { 
     itemId = doc.itemIds[j]; 
     emit(userId, { _id: itemId }); 
     } 
    } 
    } 
} 

如果用它查詢key="User_1"&include_docs=true它應該返回_id=="User_1"用戶組中的所有項目。

+0

這要求模型在項目模型中有userid,不是嗎?我無法鏈接。 – Morten

+0

不...我在答案中添加了示例代碼。希望它有助於使其更清楚。我已經將發射的值更改爲'{_id:itemId}',因此在查詢'include_docs = true'時,您可以獲取項目文檔(而不僅僅是id)。 –

+0

是的,那會工作。查找中間實體並使用這兩種類型的列表工作... – Morten