基于链接文档的值减少CouchDB

Reducing CouchDB based on value from linked document

本文关键字:CouchDB 文档 于链接 链接      更新时间:2023-09-26

我们目前有一个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);
}

并且用CCD_ 1查询该视图的结果将是:

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

然而,我们希望只返回权限设置为"public"的文档,这样查询的结果看起来像:

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

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

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

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

我是CouchDB的新手,但您应该阅读:

CouchDB加入

所以我认为您需要做的是利用复杂的键和group_level。这样做的方法是将你的地图功能结构为:

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},
]}

为了只获取"公共"文档,您必须使用范围查询和group_level查询参数:

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