CouchDB Count Уменьшить с фильтрацией по меткам времени - PullRequest
0 голосов
/ 15 января 2019

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

{ 
  _id: "a98798978s978dd98d", 
  type: "signature", 
  uid: "u12345", 
  category: "cat_1", 
  timestamp: UNIX_TIMESTAMP 
}

Моя цель - иметь возможность подсчитать все signature, созданные определенной uid, но с возможностью фильтрации по timestamp

Благодаря Алексис я дошел до этой цели с помощью функции уменьшения _count:

function (doc) {
  if (doc.type === "signature") {
    emit([doc.uid, doc.timestamp], 1);
  }
}

Со следующими запросами:

start_key=[null,lowerTimestamp]
end_key=[{},higherTimestamp]
reduce=true
group_level=1

Ответ:

{
  "rows": [
    {
      "key": [ "u11111" ],
      "value": 3
    },
    {
      "key": [ "u12345" ],
      "value": 26
    }
  ]
}

Он правильно подсчитывает uid, но фильтр не работает должным образом. Сначала я подумал, что это может быть ошибка CouchDB 2.2, но я попробовал Cloudant и получил тот же ответ.

У кого-нибудь есть идеи о том, как я могу заставить это работать с элем для фильтрации временных меток?

1 Ответ

0 голосов
/ 16 января 2019

При использовании составных ключей в MapReduce (то есть ключ - это массив вещей), вы не можете запросить диапазон ключей с отсутствующим «ведущим» элементом массива. то есть вы можете запросить диапазон uuids и получить результаты, упорядоченные по отметке времени, но ваш вариант использования работает наоборот - вы хотите запросить uuids по времени.

Я бы соблазнился поставить время первым в массиве, но метки времени unix не так хороши для группировки;). Я не знаю все тонкости вашего приложения, но если бы вы индексировали дату вместо временной метки, например, так:

function (doc) {
  if (doc.type === "signature") {
    var date = new Date(doc.timestamp)
    var datestr = date.toISOString().split('T')[0]
    emit([datestr, doc.uuid], 1);
  }
}

Это позволит вам запросить диапазон дат (с разрешением на целый день):

?startkey=["2018-01-01"]&endkey=["2018-02-01"]&group_level=2

хотя ваши uuids сгруппированы по дням.

...