2012-01-26 23 views
2

我们目前有一个CouchDB数据库,其中包含一些从其他文档创建的文档。这在文档中用'分叉'字段表示。根据链接文档的值减少CouchDB

例如:

{ 
"_id":"doc_1", 
"_rev":"1-a23f9403a1d86648b2a304f5a4c78c31", 
"doctype":"entry", 
"data":"foo", 
"permissions":"private" 
} 

{ 
"_id":"doc_2", 
"_rev":"1-9c15e43a8c8d4ce1b00af94b328d268d", 
"doctype":"entry", 
"data":"bar", 
"forked_from":"doc_1" 
"permissions":"public" 
} 

{ 
"_id":"doc_3", 
"_rev":"1-b13c761e43121c074c44736826f3ce7e", 
"doctype":"entry", 
"data":"bat", 
"forked_from":"doc_2" 
"permissions":"private" 
} 

目前我们有一个的map/reduce视图,将返回的次文件已经分叉的数量,它告诉我们最流行的是什么。

function (doc) { 
    if (doc.doctype === 'entry' && doc.forked_from) { 
     emit(doc.forked_from, 1); 
    } 
} 

function(keys, values, rereduce) { 
    return sum(values); 
} 

和查询与group=true这种观点是结果:

{"rows":[ 
{"key":"doc_1","value":1}, 
{"key":"doc_2","value":1} 
]} 

然而,我们想的是只返回具有设置为“公共”权限的文件,从而使查询结果如下:

{"rows":[ 
{"key":"doc_2","value":1} 
]} 

doc_1不应该返回,因为它是私人的。

似乎我不能在地图阶段过滤结果,因为我只有文档ID,而不是要检查的整个文档。我尝试使用链接文档功能将文档添加到密钥中,并在映射的emit中包含{'_id': doc.forked_from},但CouchDB以'include_docs对于缩小视图无效'作出响应。

有关如何过滤此视图结果的任何建议?

+0

你的意思是,原来的文件是公开的?还是叉子? –

+0

我的意思是原始文档的权限,我添加了一个示例来帮助澄清。 – Jud

回答

1

我是相当新的CouchDB的,但你应该阅读:

CouchDB Joins

所以我认为你需要做的是利用复杂的按键和group_level的。做到这一点的方法是构建你的地图功能,例如:

function (doc) { 
    if (doc.doctype === 'entry' && doc.forked_from) { 
     emit([doc.permissions, doc.forked_from], 1); 
    } 
} 

结果会是这样的group =真:

{"rows":[ 
{"key":["private", "doc_1"],"value":1}, 
{"key":["public", "doc_2"],"value":1}, 
{"key":["private", "doc_3"],"value":1}, 
]} 

为您只能获得“公共”文件,你就必须有group_level查询参数一起使用范围查询:

http://localhost/db/_design/entry/_view/getNumberForked?startkey=["public", 0]&endkey=["public", {}]&group_level=2 

这将会给你的结果:

{"rows":[ 
{"key":["public", "doc_2"],"value":1} 
]} 

我希望这可以帮助您解决您的问题。

0

你说你只有_id,但你已经检查了doc.forked_from的存在,所以肯定doc.permissions必须可用?

那么肯定你的地图功能将是......

function (doc) { 
    if (doc.doctype === 'entry' && doc.forked_from && doc.permissions === 'public') { 
     emit(doc.forked_from, 1); 
    } 
} 
+0

我已经工作了很长时间,所以我不能回去轻松测试。但我不认为这是正确的,因为我仍然想要从你的地图排除的公共文件中分出私人文件。 – Jud