是CouchDB很合适吗?

时间:2011-11-16 17:17:20

标签: database couchdb

我正在使用简单的协作功能处理待办事项列表。 基本上用户说他想分享一组待办事项。

结构是项目属于某个组,该组可供一组用户使用。 现在要获取特定用户的待办事项列表,我需要弄清楚用户也可以访问的组中的所有项目。

所以基本上结构看起来有点像这样:

user - group - item

我想要的是一个用户ID我想要用户有权访问的所有组的项目。

从我早期的实验来看,生成具有所需输出的视图似乎有些问题。 CouchDB是否合适,或者我应该寻找另一个数据库来使用?

1 个答案:

答案 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"返回用户组中的所有项目。