CouchDB意外减少/重新减少行为

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CouchDB意外减少/重新减少行为相关的知识,希望对你有一定的参考价值。

我假设我正在错误地看问题,但我似乎意外地击中了rereduce

我的问题的简化示例是学生成绩单

数据(表格式,便于阅读)

Entered     Student  Assig   Grade
2019-02-01  Alice        1    0.80
2019-03-01  Alice        2    0.50
2019-04-01  Alice        2    0.80
2019-04-01  Alice        3    0.80

与数据相关的故事是,爱丽丝是一个好学生,但教练胖子手指数据输入。爱丽丝向教练指出,然后教师对年级报告进行了修改。出于会计原因,可能不会删除条目,但可能会添加更新的条目。

地图:

function(doc){
    var key = [doc.student,doc.assig];
    var val = {
        grade:doc.grade,
        entered: doc.entered
    };
    emit(key,val);
}

减少时有两个目标:

  1. 取最近输入的成绩
  2. 在成绩上收集stats
function(keys,values,rereduce){
    if(rereduce){
        return sum(values);
    }
    else{
        value = values.pop();
        for(var v in values){
            v = values[v];
            if(v.entered > value.entered){
                value = v;
            }
        }
        return value.grade;
    }
}

我申请group=true的那一刻,我期望得到每个作业的最新成绩列表。相反,我得到了所有成绩的总和。

Key           Actual   Expected
["Alice",1]     0.8       0.8
["Alice",2]     1.3       0.8
["Alice",3]     0.8       0.8

奇怪的是,进一步减少:

Key           Actual   Expected
["Alice"]       2.4       2.4

我糊涂了。我怎么弄糊涂自己?

(CouchDB v2.3)

编辑

好的,所以我理解我是怎么做错的(溢出索引),但现在我想知道如何使它正确...

http://guide.couchdb.org/draft/views.html#reduce

我对group_leve 1和2的行为仍然非常困惑。

答案

我怀疑发生的事情是我使用错误的工具来完成工作。当CouchDB有一份工作时,它们的工作效率会降低。

最后使用的解决方案是创建一个update函数,它只是将新等级添加到现有文档的数组中。

沉重地基于RTFM时刻:https://docs.couchdb.org/en/stable/ddocs/views/collation.html

Student  Assig   Grades
Alice        1    [{e:'2019-02-01',g:0.80}]
Alice        2    [{e:'2019-04-01',g:0.80},{e:'2019-03-01',g:0.50}]
Alice        3    [{e:'2019-04-01',g:0.80}]

地图变为......

function(doc){
    var key = [doc.student,doc.assig];
    var val = doc.grades.shift().grade;
    emit(key,val);
}

...而reduce可以使用内置的reduce函数。

唯一丢失的是对数据的修改并不明显,但是创建一个视图来报告它是很简单的:

function(doc){
    for(var val in doc.grades){
        var key = [doc.student,doc.assig,val.entered];
        emit(key,val.grade);
    }
}

现在,用户可以访问详细的更改列表以及聚合结果。

上面的代码是未经测试的,因为它是一个简单的问题示例。从概念上讲,它是正确的;语法上,我期待问题。

以上是关于CouchDB意外减少/重新减少行为的主要内容,如果未能解决你的问题,请参考以下文章

couchdb 查询地图视图而不是减少视图

如何减少两行浏览片段之间的距离

如何减少页面之间跳转的延迟(片段/活动)

CouchDB学习-维护

如何在捆绑时减少反应应用程序构建时间和理解 webpack 的行为

在 Couchdb 中订购