2011-11-16 35 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

相关问题