Как группировать в функции сокращения CouchDB

Я пытаюсь разобраться с запросами карты / сокращения при использовании PouchDB / CouchDB.

У меня много документов в моей базе данных, но мне нужно создать дизайн, который запрашивает документы и дает мне все уникальные имена команд в качестве ключа, а затем сообщает мне

а) сколько уникальных вардов в каждой команде

б) общее количество работ в команде (по всем подопечным)

Структура моих данных:

{
    "_id": "0448071807c0f37f53e06aab54034a42",
    "_rev": "6-13fd78ada9c8833ec36a01af0acd5957",
    "team": "Team A",
    "ward": "Ward A",
    "date": "2017-03-30",
    "person": "Alice",
    "bed": "Bed 001",
    "jobs": [1,2,3,4]
}

{
    "_id": "0448071807c0f37f53e06aab54034a42",
    "_rev": "6-13fd78ada9c8833ec36a01af0acd5957",
    "team": "Team A",
    "ward": "Ward B",
    "date": "2017-03-30",
    "person": "Bob",
    "bed": "Bed 001",
    "jobs": [1,2]
}   

{
    "_id": "0448071807c0f37f53e06aab54034a42",
    "_rev": "6-13fd78ada9c8833ec36a01af0acd5957",
    "team": "Team A",
    "ward": "Ward C",
    "date": "2017-03-30",
    "person": "Charles",
    "bed": "Bed 001",
    "jobs": [9,5]
}   

{
    "_id": "0448071807c0f37f53e06aab54034a42",
    "_rev": "6-13fd78ada9c8833ec36a01af0acd5957",
    "team": "Team B",
    "ward": "Ward 00",
    "date": "2017-03-30",
    "person": "David",
    "bed": "Bed 001",
    "jobs": [1]
}   

Результат, который я ожидал, будет таким:

Команда А - 3 уникальных подопечных - 8 заданий

Команда Б - 1 уникальный подопечный - 1 работа

e.g.

{
    "key": "Team A",
    "value": {
        "wards": 3,
        "jobs": 8
    }
}

{
    "key": "Team B",
    "value": {
        "wards": 1,
        "jobs": 1
    }
}

Моя карта в настоящее время:

{
   "all": {
       "map": "function(doc) { emit(doc.team, doc) }"
   }
}

Это сокращение, в котором я борюсь.

ИЗМЕНИТЬ

Я принял предложения, использованные в эквиваленте CouchDB View для SUM & GROUP BY Но это только половина моей задачи.

Если я использую:

{
   "all": {
       "map": "function(doc) { emit([doc.team, doc.ward], 1) }",
       "reduce": "function(keys, values) { return sum(values); }"
   }
}

Затем перейдите к http://my-ip:5984/wardround_jobs/_design/teams/_view/all?group_level=1, то я вижу уникальные команды (хорошо) и количество вхождений (тоже отлично), но я не уверен, как расширить функцию сокращения, чтобы включить общее количество рабочих мест.


person Chris    schedule 03.04.2017    source источник
comment
Возможный дубликат эквивалента CouchDB View для SUM & GROUP BY   -  person Flimzy    schedule 03.04.2017
comment
Спасибо. Я обновил свой вопрос на основании того, что я узнал из этого сообщения. Это помогает, но я все еще немного застрял   -  person Chris    schedule 03.04.2017


Ответы (1)


Во-первых, вы должны указать длину заданий (количество заданий):

function (doc) {
  emit([doc.team,doc.ward],doc.jobs.length);
}

Затем вам понадобится такая функция уменьшения:

function (keys, values, rereduce) {
  var stats = {uniq:0,jobs:0};
  if (rereduce) {
    for(var i=0;i<values.length;i++){
     stats.uniq += values[i].uniq;
     stats.jobs += values[i].jobs;
    }
    return stats;
  }
  stats.uniq = values.length;
  stats.jobs = sum(values);
  return stats;
}

Для первой итерации мы возвращаем объект (stats) с количеством подопечных пермской команды (uniq) и количеством заданий (мы суммируем длину заданий каждой команды / подопечного.

Затем для восстановления мы просто агрегируем значения объекта.

person Alexis Côté    schedule 04.04.2017
comment
Это здорово и очень полезно. Спасибо. - person Chris; 05.04.2017