Я предполагаю, что неправильно смотрю на проблему, но мне кажется, что она неожиданно набирает 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.