Представление 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 должно быть больше, чем временная метка на 1 час позже текущего времени. Точно так же мы должны получить, если fromTime также падает с текущей отметки времени до отметки времени следующего часа.

Я новичок в диване. Созданное мной представление

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);
      }
    }

  }

}

Я отправляю startkey = "currentTimestamp_0000000000000" и endkey = "0000000000000_currentTime + 1hour-timestamp"

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


person Kishore Barik    schedule 01.03.2016    source источник
comment
Вы можете уточнить? Вы имеете в виду, что вам все равно время от времени? или fromTime должно быть больше, чем сейчас?   -  person Roi Katz    schedule 03.03.2016


Ответы (1)


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

startkey 18_00
endkey   00_19

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

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

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

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

person TAM    schedule 05.03.2016
comment
Это хороший и типичный ответ. condider в этом случае используйте один ключ (fromTime или toTime) для получения результата, а затем отфильтруйте другой лучше, чем объединение с двумя результатами: 1. emit (fromTime, toTime) используйте диапазон fromTime, 2. отфильтруйте результат 1 с помощью toTime. и другая программа обновления должна изменить status = pending на другое значение. - person Intae Kim; 06.03.2016