CouchDB неожиданное уменьшение / редукция поведения - PullRequest
0 голосов
/ 25 апреля 2019

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

1 Ответ

0 голосов
/ 28 апреля 2019

Я подозреваю, что происходит, что я использую не тот инструмент для работы. Сокращения в 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);
}

... и уменьшение может использовать встроенные функции уменьшения.

Единственное, что упущено, это то, что изменения данных не так очевидны, однако создать представление для отчета просто:

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

Теперь пользователи имеют доступ как к подробному списку изменений, так и к агрегированным результатам.

Приведенный выше код не проверен, поскольку является тривиальным примером проблемы. Концептуально, это правильно; синтаксически я ожидаю проблем.

...