我正在使用简单的协作功能处理待办事项列表。 基本上用户说他想分享一组待办事项。
结构是项目属于某个组,该组可供一组用户使用。 现在要获取特定用户的待办事项列表,我需要弄清楚用户也可以访问的组中的所有项目。
所以基本上结构看起来有点像这样:
user - group - item
我想要的是一个用户ID我想要用户有权访问的所有组的项目。
从我早期的实验来看,生成具有所需输出的视图似乎有些问题。 CouchDB是否合适,或者我应该寻找另一个数据库来使用?
答案 0 :(得分: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"
返回用户组中的所有项目。