是CouchDB的一个很好的契合?
问题描述:
我正在做一个简单的协作功能列表。 基本上用户说他想共享一组待办事项。是CouchDB的一个很好的契合?
结构是一个项目属于一个组,并且该组可供一组用户使用。 现在要获取特定用户的待办事项列表,我需要找出用户也可以访问的所有组。
所以基本结构看起来有点像这样:
用户 - 组 - 项目
我要的是给一个用户ID我想要的物品为所有用户具有访问权限的组。
从我的早期实验来看,用期望的输出产生视图似乎有些问题。 CouchDB是否合适,还是应该寻找其他数据库来处理?
答
如果我理解正确,每个组都有一个用户列表和一个项目列表。然后,对于每个组,可以发出针对每个(用户,项目)的行一对:
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"
用户组中的所有项目。
这要求模型在项目模型中有userid,不是吗?我无法链接。 – Morten
不...我在答案中添加了示例代码。希望它有助于使其更清楚。我已经将发射的值更改为'{_id:itemId}',因此在查询'include_docs = true'时,您可以获取项目文档(而不仅仅是id)。 –
是的,那会工作。查找中间实体并使用这两种类型的列表工作... – Morten