Введите 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()
- это функция, которую вы должны определить, чтобы получить массив периодов, к которым относится данная дата.