Couchbase 视图过滤日期范围内的数据

Couchbase view to filter data between date range

我有以下格式的 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"
    }
  }
}

已安排作业。这些作业可以在 fromTimetoTime 之间的任何时间执行。我的任务是每小时检查下一个小时是否有待处理的工作。意味着无论 fromTime 是什么,但 toTime 时间戳应该大于当前时间后 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);
      }
    }

  }

}

我正在发送 startkey="currentTimestamp_0000000000000" 和 endkey="0000000000000_currentTime+1hour-timestamp"

请帮我看看我错在哪里。

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

startkey 18_00
endkey   00_19

按字典顺序,startkey比endkey大,所以区间为空

在我看来最简单的方法是创建两个单独的视图,一个只发出 fromTime,另一个发出 toTime。如果我对要求的理解正确,您将搜索从现在到现在 + 1 小时之间具有 fromTime 的所有工作,对于 toTime 也是如此,然后对两个结果进行编程集并集。

仅使用一个视图可能会更简单,并且对于每个 scheduledJob,执行 2 次发出,一次是 fromTime,另一个是 toTime。但我从未尝试过在文档上执行超过 1 个 emit,所以你必须尝试它是否有效。

在我看来,您将数字值转换为字符串的方法很容易出错。如果需要复合键,我更喜欢使用合适的 couchbase 复合键,例如通过emit([job.fromTime, job.toTime], job)。但是我没有看到使用那种密钥可以轻松解决您的问题。