在沙发Db或cloudant中查找startdate和enddate之间的重叠日期范围

时间:2017-03-06 18:33:08

标签: couchdb views cloudant

您好我正在使用数据库作为couchDb构建预订应用程序。我有几个预订文件,每个都有roomId,开始日期和结束日期。

现在,当用户使用roomId,开始日期和结束日期创建会议请求时,我需要在现有预约中搜索开始时间和结束时间之间的重叠时间范围,并仅在没有冲突时创建预留。除此之外,我还需要检查一下房间。

该要求类似于Determine Whether Two Date Ranges Overlap

我在我的沙发数据库上创建了一个三个键的视图:

function (doc) {  
    if (doc.type == "reservation") {  
         emit([doc.roomid, doc.startTime, doc.endTime], doc);  
    }
} 

我确实尝试创建像

这样的东西
?startkey=["1970-01-01T00:00:00Z", ""]&endkey=["\ufff0", "1971-01-01T00:00:00Z"]

但是,我并没有真正得到如何复合查询视图以找到与roomid一起的日期范围。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

您可以使用Cloudant Query并指定参考答案中列出的(StartA <= EndB) and (EndA >= StartB)搜索条件。

创建索引

POST端点发送_index请求,将以下JSON数据结构作为有效负载传递。

  POST https://$USERNAME:$PASSWORD@$HOST/$DATABASE/_index HTTP/1.1

 {
  "index": {
   "fields": [
     { "name":"startTime",
       "type":"string"
     }, 
     { 
       "name":"endTime",
       "type":"string"
     }, 
     { 
       "name":"roomid",
       "type":"string"
     } 
   ]
  },
  "type": "text"
 }

查询索引

POST端点发送_find请求,将以下JSON数据结构作为有效负载传递。

  POST https://$USERNAME:$PASSWORD@$HOST/$DATABASE/_find HTTP/1.1

  {
   "selector": {
    "startTime": {
      "$lte": "2017-03-06T15:00:00Z"
    },
    "endTime": {
      "$gte": "2017-03-06T14:00:00Z"
    },
    "roomid": {
      "$eq": "room 123"
    }
   }
  }

根据需要替换时间戳和房间标识符值。如果查询返回至少一个您遇到预订冲突的文档。