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);
}
减少时有两个目标:
- 取最近输入的成绩
- 在成绩上收集
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意外减少/重新减少行为的主要内容,如果未能解决你的问题,请参考以下文章