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;
}

如果这是可能的,请描述如何做到这一点。谢谢!

4

2 回答 2

1

还有一些其他的选择。

在 CouchDB 中有一个不太知名的 JOIN 技巧。但是,您必须共享 MapReduce 视图的结果,而不是使用复制——不幸的是,您可以将视图用作复制的过滤器。如果您使用 Cloudant(免责声明:我受雇于 Cloudant),您可以使用链式 MapReduce 将结果输出到另一个数据库,然后您可以从...

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

于 2013-11-13T00:01:21.950 回答
0

不,这是不可能的。每个文档必须是一致的,因此它与其他文档没有任何明确的关系。具有contact_id参考价值只是您的协议 - CouchDB 不知道这一点。

您需要将类别文档嵌套在联系人之一中才能执行此类技巧,例如通过过滤器功能处理单个文档。当您需要保持联系文档的一致状态时,这是一个很好的解决方案。

于 2013-11-08T15:23:15.830 回答