在联系人管理应用程序中,每个用户都有自己的数据库。当用户希望与他人共享某些类别的联系人时,后端将启动复制。每个联系人都是自己的文档,但也有各种子文档,如笔记和约会。
这是一个例子......
联系人:
{
"_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"
}
所以,让我们说吉米希望与销售经理凯文分享他唯一的客户,而他的个人联系人仍然是私人的。 当笔记通过复制过滤器时,是否可以访问关联联系人的类别字段?
或者我是否必须在联系人的每个孩子中复制类别字段?我不希望这样做,因为每个联系人可能有很多孩子,每次类别更改时我都必须手动更新。
以下是过滤函数的一些伪代码:
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;
}
如果可以,请说明如何操作。谢谢!
答案 0 :(得分:1)
还有其他一些选择。
有一个not-so-well-known JOIN trick in CouchDB。但是,您不必使用复制,而是必须共享MapReduce视图的结果 - 遗憾的是,您可以使用视图作为复制过滤器。如果您正在使用Cloudant(免责声明:我受雇于Cloudant),您可以使用chained-MapReduce将结果输出到另一个数据库,然后您可以从中复制...
此外,我认为这篇关于文档结构的SO帖子/答案以及这个连接技巧可能会有所帮助:Modeling relationships on CouchDB between documents?
答案 1 :(得分:0)
不,这是不可能的。每个文档必须一致,因此它与其他文档没有任何明确的关系。将contact_id
值作为参考只是您方面的协议 - CouchDB不了解这一点。
您需要将类别文档嵌套在联系人中以实现此类技巧,例如通过过滤功能处理单个文档。当您需要具有一致状态的联系文档时,这是一个很好的解决方案。