Javascript 基于链接文档中的值减少CouchDB

Javascript 基于链接文档中的值减少CouchDB,javascript,couchdb,Javascript,Couchdb,我们目前有一个CouchDB数据库,其中包含一些从其他文档创建的文档。这用文档中的“forked from”字段表示 例如: { "_id":"doc_1", "_rev":"1-a23f9403a1d86648b2a304f5a4c78c31", "doctype":"entry", "data":"foo", "permissions":"private" } { "_id":"doc_2", "_rev":"1-9c15e43a8c8d4ce1b00af94b328d268d", "do

我们目前有一个CouchDB数据库,其中包含一些从其他文档创建的文档。这用文档中的“forked from”字段表示

例如:

{
"_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}
]}
但是,我们希望只返回权限设置为“public”的文档,以便查询结果如下所示:

{"rows":[
{"key":"doc_2","value":1}
]}
doc_1
不应返回,因为它是私有的

我似乎无法在映射阶段过滤结果,因为我只有文档id,而没有要检查的整个文档。我尝试使用链接文档功能将文档添加到键中,并在映射的
emit
中包含
{''u id':doc.forked\u from}
,但CouchDB响应为“include\u docs对于reduce视图无效”


关于如何筛选此视图的结果,您有什么建议吗?

我对CouchDB相当陌生,但您应该阅读:

所以我认为你需要做的是利用复杂的键和组级别。实现这一点的方法是按如下方式构造映射函数:

function (doc) { 
    if (doc.doctype === 'entry' && doc.forked_from) {
        emit([doc.permissions, doc.forked_from], 1);
    }
}
如果group=true,结果如下:

{"rows":[
{"key":["private", "doc_1"],"value":1},
{"key":["public", "doc_2"],"value":1},
{"key":["private", "doc_3"],"value":1},
]}
要仅获取“公共”文档,必须使用范围查询和组级查询参数:

http://localhost/db/_design/entry/_view/getNumberForked?startkey=["public", 0]&endkey=["public", {}]&group_level=2
这将给出您的结果:

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

我希望这能帮助你解决你的问题

您说您只有_id,但您已经检查了doc.forked_from的存在,所以doc.permissions肯定是可用的吗

所以你的地图功能肯定是

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

你是说原始文件是公开的吗?还是fork?我指的是原始文档的权限,我添加了一个示例来帮助澄清。我已经很久没有做过这方面的工作了,所以我无法回去轻松测试。但我不认为这是完全正确的,因为我仍然想计算从公共文档中派生出来的私人文档,您的地图不包括这些文档。