我有以下格式的沙发床文件

{
  "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”

请帮我哪里错了。

最佳答案

您提供的startkey / endkey组合在所有非平凡情况下都会产生空结果。想象一下(为简单起见,缩短为2位数字),当前时间为18,下一小时为19。那么您的字符串是:

startkey 18_00
endkey   00_19


在字典上,开始键大于结束键,因此间隔为空。

在我看来,最简单的方法是创建两个单独的视图,一个仅发出fromTime,另一个发出toTime。如果我理解正确的要求,那么您将搜索从现在到现在+ 1小时之间具有fromTime的所有作业(与toTime相同),并以编程方式对这两个结果进行合并。

仅使用一个视图可能会更简单,并且对于每个ScheduledJob,执行2次发射,其中一个是fromTime,另一个用于toTime。但是我从未尝试对文档进行超过1次的发射,因此您将不得不尝试它是否有效。

您将数字值转换为字符串的方式对我来说似乎很容易出错。如果需要复合键,我希望使用适当的沙发基复合键,这可以通过例如emit([job.fromTime, job.toTime], job)。但是我看不到使用这种键可以轻松解决您的问题。

10-07 14:32