您好我正在使用数据库作为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一起的日期范围。
任何帮助都将不胜感激。
答案 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"
}
}
}
根据需要替换时间戳和房间标识符值。如果查询返回至少一个您遇到预订冲突的文档。