如果我理解正确,每个组都有一个用户列表和一个项目列表。然后,对于每个组,可以发出针对每个(用户,项目)的行一对:
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