2015-10-08 2 views
1

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

{"username":"one","timestamp":"2015-10-07T15:04:46Z"} --- | в тот же день {"username":"one","timestamp":"2015-10-07T19:22:00Z"} ---^
{"username":"one","timestamp":"2015-10-25T04:22:00Z"}
{"username":"two","timestamp":"2015-10-07T19:22:00Z"}

То, что я хочу знать, подсчитывать # уникальных пользователей в течение определенного периода времени. Пример:

2015-10-07 = {"count": 2}два различных пользователей доступ на 2015-10-07
2015-10-25 = {"count": 1}одного другого пользователя получить доступ на 2015-10-25
2015 = {"count" 2}два различных пользователей доступ к 2015 году

Это все просто становится сложным, потому что, например, в 2015-10-07, имя пользователя: один имеет две записи, когда они обращаются, но он должен возвращать только число 1 для всех уникальных пользователей.

Я пробовал:

function(doc) { 
    var time = new Date(Date.parse(doc['timestamp'])); 
    emit([time.getUTCFullYear(),time.getUTCMonth(),time.getUTCDay(),doc.username], 1); 
} 

Это страдает от ряда проблем, которые подсвечиваются Иисус Alva, который комментировал в посте я связан выше.

Спасибо!

ответ

1

Там, наверное, лучший способ сделать это, но с верхней части моей головы ...

Вы можете попробовать испускать индекс для каждого уровня детализации:

function(doc) { 
    var time = new Date(Date.parse(doc['timestamp'])); 
    var year = time.getUTCFullYear(); 
    var month = time.getUTCMonth()+1; 
    var day = time.getUTCDate(); 

    // day granularity 
    emit([year,month,day,doc.username], null); 

    // year granularity 
    emit([year,doc.username], null); 
} 

// reduce function - `_count` 

запрос Day (2015 -10-07):

inclusive_end=true& 
start_key=[2015, 10, 7, "\u0000"]& 
end_key=[2015, 10, 7, "\uefff"]& 
reduce=true& 
group=true 

день результат запроса - код вашего приложения будет подсчитывать количество строк:

{"rows":[ 
    {"key":[2015,10,7,"one"],"value":2}, 
    {"key":[2015,10,7,"two"],"value":1} 
]} 

Год запроса:

inclusive_end=true& 
start_key=[2015, "\u0000"]& 
end_key=[2015, "\uefff"]& 
reduce=true& 
group=true 

Результат запроса - код вашего приложения будет подсчитывать количество строк:

{"rows":[ 
    {"key":[2015,"one"],"value":3}, 
    {"key":[2015,"two"],"value":1} 
]} 
+0

Ах, я не понимаю, что я мог испускать несколько типов с той же точки зрения , Быстрый вопрос ---- Что такое «\ u0000» и «\ uefff»? – Deftness

+0

Они представляют собой маленькие и большие значения юникода. В основном это означает, что каждое значение для этого атрибута. –

+0

ах! как маленький подстановочный знак, мне это нравится. Я думаю, что последнее, что делает «inclusive_end»? Я собираюсь отметить этот вопрос, как решить, спасибо, кстати !!! – Deftness

Смежные вопросы