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"
}
}
}
已安排作业。这些作业可以在 fromTime 和 toTime 之间的任何时间执行。我的任务是每小时检查下一个小时是否有待处理的工作。意味着无论 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)
。但是我没有看到使用那种密钥可以轻松解决您的问题。
我有以下格式的 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 也从当前时间戳落到下一小时时间戳,我们应该获取。
我是 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)
。但是我没有看到使用那种密钥可以轻松解决您的问题。