2016-03-01 3 views
0

Я couchbase документов в следующем форматеCouchbase вида фильтрация данных между диапазоном дат

{ 
    "docType": "scheduledJob", 
    "orgId": 2, 
    "jobs": { 
    "1456753078157": { 
     "jobName": "Job1", 
     "jobId": "910271049", 
     "fromTime": 1456752600000, 
     "toTime": 1456824600000, 
     "key": 1456753141401, 
     "status": "pending" 
    }, 
    "1456753141401": { 
     "jobName": "Job2", 
     "jobId": "558624841", 
     "fromTime": 1456752600000, 
     "toTime": 1456821000000, 
     "key": 1456753141401, 
     "status": "pending" 
    } 
    } 
} 

, которые имеют работу по расписанию. Работы могут выполняться в любое время, которое находится между fromTime и toTime. Моя задача - проверять каждый час, если на предстоящий час будет какая-то работа. Означает то, что fromTime есть только toTime timestamp должен быть больше отметки времени 1 час после текущего времени. Аналогичным образом мы должны получить, если fromTime также падает с текущей метки времени до отметки времени в следующий час.

Я новичок в couchbase. Вид я создал это

function(doc, meta){ 
    if(doc.docType && doc.docType=="scheduledJob"){ 
    for(var key in doc.jobs){ 
     var job = doc.jobs[key] 
     if(job.status == "pending") { 
    emit(job.fromTime+'_'+job.toTime, job); 
     } 
    } 

    } 

} 

Я посылаю Клавишапуска = «currentTimestamp_0000000000000» и EndKey = «0000000000000_currentTime + 1час-временную метку»

Пожалуйста, помогите мне, где я неправильно.

+0

Вы можете уточнить? Вы имеете в виду, что вы не заботитесь о времени? или fromTime должен быть больше, чем «сейчас»? –

ответ

1

Комбинация комбинации запуска/конечного ключа во всех нетривиальных случаях дает пустой результат. Представьте себе (для простоты укороченной до 2 цифр) текущее время, чтобы быть 18, а на следующий час будет 19. Тогда ваши строки:

startkey 18_00 
endkey 00_19 

Лексикографический, то StartKey больше, чем EndKey, поэтому интервал пустой.

Самый простой способ для меня создать два отдельных вида, один из которых испускает только fromTime, а другой - toTime. Если я правильно понимаю требования, вы будете искать все задания, имеющие fromTime между теперь и сейчас + 1 час, то же самое для toTime, и делать программный набор объединения двух результатов.

Возможно, было бы проще использовать только один вид, и для каждого запланированногоJob, делающего 2 испускания, один из ofTime, другой для toTime. Но я никогда не пробовал делать более одного выброса на документе, поэтому вам придется попробовать, работает ли он.

Ваш способ преобразования чисел в строку выглядит довольно подверженным ошибкам. Если необходим составной ключ, я бы предпочел подходящий ключевой состав couchbase, который достигается, например, emit([job.fromTime, job.toTime], job). Но я не вижу легкого решения проблемы с помощью такого ключа.

+0

Этот ответ хорош и типичен. condider в этом случае использует один ключ (fromTime или toTime), чтобы получить результат, а затем отфильтровать другой лучше, чем объединение с двумя результатами: 1. emit (fromTime, toTime) использовать из диапазона Time, 2. фильтровать результат 1 с toTime. , а другой обновитель должен изменить статус = в ожидании другого значения. –

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