Couchbase视图用于在日期范围之间过滤数据

时间:2016-03-01 07:01:26

标签: javascript couchbase couchbase-view nosql

我有以下格式的沙发基础文件

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

请在我出错的地方帮助我。

1 个答案:

答案 0 :(得分:1)

您提供的startkey / endkey组合将在所有非平凡的情况下产生空结果。想象一下(简单地缩写为2位数)当前时间为18,下一个小时为19.然后你的字符串是:

required

按字典顺序,startkey大于endkey,因此间隔为空。

在我看来,最简单的方法是创建两个单独的视图,一个只发出fromTime,另一个发出toTime。如果我理解了正确的要求,你将搜索从现在到现在+ 1小时之间的所有作业,对于toTime,同时执行两个结果的程序集合。

使用一个视图可能更简单,并且,对于每个scheduledJob,执行2次发射,其中一个是fromTime,另一个是toTime。但是我从未尝试过对文档执行多次发射,因此您必须尝试它是否有效。

您将数字值转换为字符串的方式对我来说非常容易出错。如果需要一个复合键,我更喜欢一个合适的沙发座复合键,这可以通过例如startkey 18_00 endkey 00_19 。但是我没有看到使用这种密钥解决问题的简单方法。