CouchDB:在过滤器函数内部访问链接文档是否可行?

3
在一个联系人管理应用中,每个用户都会有自己的数据库。当用户希望与他人分享特定类别的联系人时,后端将启动复制过程。每个联系人是其自身的文档,但也有各种子文档,例如笔记和约会。
以下是一个例子...
联系人:
{
  "_id": 123,
  "type": "contact",
  "owner": "jimmy",
  "category": "customer",
  "name": "Bob Jones",
  "email": "bob@example.com"
}

注意:
{
  "_id": 456,
  "type": "note",
  "owner": "jimmy",
  "contact_id": 123,
  "timestamp": 1383919278,
  "content": "This is a note about Bob Jones"
}

让我们假设Jimmy想与销售经理Kevin分享他的客户,而他的个人联系人保持私密。当注释通过复制筛选器时,是否可以访问链接联系人的类别字段? 或者我必须在每个联系人的每个子项中都复制类别字段?我希望不必这样做,因为每个联系人可能有很多子项,每次更改类别时都需要手动更新。
以下是过滤函数的伪代码:
function(doc, req)
{
  if(doc.type == “contact”) {
    if(doc.category == req.query.category) {
      return true;
    }
  }
  else if(doc.contact_id) {
    if(doc.contact.category == req.query.category) {
      return true;
    }  
  }
  return false;
}

如果可能的话,请描述如何实现它。谢谢!
2个回答

1

还有其他一些选项。

CouchDB中有一个不太为人知的JOIN技巧。但是,您将不得不共享MapReduce视图的结果,而不是使用复制--不幸的是,您无法将视图用作复制的过滤器。如果您正在使用Cloudant(免责声明:我受雇于Cloudant),则可以使用链接MapReduce将结果输出到另一个数据库,然后可以从该数据库进行复制...

此外,我认为这个SO帖子/关于文档结构和这个连接技巧的答案可能会有所帮助:CouchDB文档之间的建模关系?


有用的信息,但不能解决基于链接文档的过滤问题。我认为最简单的解决方案就是重新规范化我的数据。 - Colin Skow

0
不,这是不可能的。每个文档必须保持一致,因此它与其他文档没有任何明确的关系。将contact_id值作为参考是你方面的协议 - CouchDB并不知道这一点。
你需要将类别文档嵌套在联系人文档中,才能使用这种技巧,例如通过过滤函数处理单个文档。从需要保持联系人文档状态一致的角度来看,这是一个好的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接