отображать рассчитанные данные с помощью CouchDB и PouchDB

Я пытаюсь понять, как вернуть рассчитанные данные в документах с помощью CouchDB и PouchDB. Скажем, у меня на CouchDB есть два типа документов: Блоки и Отчеты.

Отчеты состоят из: report_id, block_id и date.

Блок состоит из: block_id и name.

Я хотел бы вычислить для каждого блока его последний report_id (идентификатор самого последнего отчета) и вернуть его с документом блока.

Есть ли способ этого добиться? Я предполагаю, что View некоторого типа поможет, но я не могу этого понять.


person efratyo    schedule 17.07.2017    source источник


Ответы (1)


Вы можете сделать это с помощью функций map / reduce в CouchDB.

Допустим, у вас есть эти документы:

{
  "_id": "report_1",
  "type": "report",
  "block_id": "block_1",
  "date": "1500325245"
}



{
  "_id": "report_2",
  "type": "report",
  "block_id": "block_1",
  "date": "1153170045"
}

Вы хотите получать отчеты с наивысшей отметкой времени (в данном случае repot_1).

Мы начинаем с создания функции сопоставления, которая сопоставляет документы с bloc_id в качестве ключа и отметкой времени + идентификатор отчета в качестве значения для функции сокращения.

Карта :

function (doc) {
  if(doc.type == "report")
    emit(doc.block_id,{date:doc.created,report:doc._id});
}

Затем мы создадим функцию уменьшения. Когда rereduce имеет значение false, мы просто вернем значения. Когда rereduce истинно, мы найдем максимальную временную метку и вернем связанный с ней идентификатор отчета.

Функция уменьшения:

function (keys, values, rereduce) {
    if (rereduce) {
        var max = 0;
        var maxReportId = -1;
        for (var i = 0; i < values.length; i++) {
            var val = values[i][0];
            if (parseInt(val.date) > max) {
                max = val.date;
                maxReportId = val.report;
            }
        }
        //We return the report id of the most recent report.
        return maxReportId;
    } else
        return values;
}
person Alexis Côté    schedule 17.07.2017