CouchDb сокращение на две клавиши - PullRequest
1 голос
/ 27 января 2012

У меня есть документ в моей CouchDB, который имеет следующую структуру:

{date: 1234567, authors: ['Foo', 'Bar']}

Моя цель - выяснить, насколько «активен» определенный автор.Работать со следующими хорошо работает:

map: function(doc) {
  doc.authors.forEach(function(name) {
    emit(name, 1);
  });
},
reduce: function(keys, values) {
  return sum(values);
}

Но теперь мне интересно, как я мог бы также установить (динамический) предел для даты: поле?

Cheers

1 Ответ

1 голос
/ 27 января 2012

Введите date в ключе:

карта:

function (doc) {
  if (doc.authors && doc.date) {
    doc.authors.forEach(function (author) {
      emit([author, doc.date], 1);
    });
  }
}

уменьшить:

_sum

и запрос с (правильно закодированным URL):

startkey=['author',STARTDATE]&endkey=['author',ENDDATE]&group_level=1

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

  • Наиболее общим решением является использование функций списка . Однако имейте в виду, что они тяжелы на сервере, потому что результат не сохраняется на диске, как в случае с map / lower.

  • Если у вас есть предопределенные периоды (например, месяцы или годы), вы можете создать строку для каждого периода, к которому принадлежит doc.date, и поместить этот период в качестве первого элемента в ключе.

Например, используйте следующую функцию карты (такое же уменьшение, как и раньше):

function (doc) {
  if (doc.authors && doc.date) {
    var periods = getPeriod(doc.date);
    doc.authors.forEach(function (author) {
      periods.forEach(function (period) {
        emit([period, author], 1);
      });
    });
  }
}

и запрос с:

startkey=[PERIOD]&endkey=[PERIOD,{}]&group_level=exact

Здесь getPeriod() - это функция, которую вы должны определить, чтобы получить массив периодов, к которым относится данная дата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...