我的 couchdb 中有一组文档,我在这里提到了一个示例文档:
{
"_id": "26",
"_rev": "1-53ac67e9ec4b4ce8ffa9cd609e107aaf",
"customer_name": "Vadilal",
"type": "trip",
"duration": "10 hours 27 mins",
"end_time": "Jan 1, 2014 10:11:00 PM",
"start_time": "Jan 11, 2014 8:46:00 AM",
}
如果我从 URL 传递 timestamp(key)
,如果它在 start_time
和 end_time
之间,那么我想获取文档.
例子:
假设 url 是这样的
.../trip/_design/trip/_view/trip?key="Jan 10, 2014 8:46:00 AM"
这里我将时间戳传递为 Jan 10, 2014 8:46:00 AM
所以它介于上面的 start_time
和 end_time
之间提到的文档,在这种情况下我需要获取剩余的信息。
请帮助解决这个问题,这对我有很大的帮助。
我写了如下函数:
function(doc){
if(doc.type=="trip"){
var startTime=new Date(doc.start_time);
var endTime=new Date(doc.end_time);
emit([startTime.getTime(),endTime.getTime()], doc);
}
调用 URL 如下:
../trip/_design/trip/_view/trip?startkey=[1390086890000]&endkey=[1390086890000,{}]
根据我的要求,以上一个是正确的吗???
最佳答案
不幸的是,这是不可能的。您的要求有两个问题。
View 按键排列
您可以编写这样的 View 以分别按开始键或结束键索引文档。
function(doc){
emit(doc.start_time, doc_id); // amend with end key to index by end key.
}
您可以在查询中使用三个参数:
- key - 匹配一个精确的键
- startkey - 匹配所有大于或等于起始键的文档
- endkey - 匹配所有大于或等于结束键的文档
排序问题
根据类型,您的索引键将按字母顺序或整数排序。
因此,如果您的 View trip
使用这样的开始键:
.../trip/_design/trip/_view/trip?start_key="Jan 10, 2014 8:46:00 AM"
您可以返回大于或等于字符串“Jan 10, 2014...”的所有值,这对于“Jan 11, 2014”或“Jan 31, 2014”是正确的,但对于“July”会有误报22, 2011”或“2014 年 2 月 1 日”的假阴性,如 F < J.
要解决此问题,您必须将开始日期转换为可以按时间顺序排序的日期,例如:
- 将日期解析为日期时间,然后转换为纪元,如 How to get time in milliseconds since the unix epoch in Javascript?
- 将日期转换为 yyyyMMddHHmmss 格式,如 20140110084600
这两个都会正确排序。
你能解决你的问题吗
是的,但需要一些客户端代码。这是食谱:
- 创建两个 View
trip/by_start_date
和trip/by_end_date
分别返回开始和结束日期作为键。按照上面第二部分排序的方式。 - 获得两套文件。
- 第 1 组应返回所有在您的日期之前开始的文档:
..._view/by_start_date?endkey=[your_date]
- set 2 应返回所有在您的日期之后结束的文档:
..._view/by_end_date?startkey=[your_date]
- 然后您有两组文档 ID,您所追求的结果将是这两组文档中的那些文档。
进一步优化
在上面的解决方案中,您可能会得到太多的返回值而无法处理。您可以使用 CouchDB 的键控多个值的功能进一步减少它。按开始日期和结束日期键,如下所示:
function(doc){
var start_time = some_conversion_function(doc.start_time);
var end_time = some_conversion_function(doc.end_time);
emit([start_time, end_time], doc_id);
}
如果您对开始时间和结束时间之间的最大差异有任何更多详细信息,您可以使用它来进一步减少每组中的文档。下面的示例将返回开始时间不晚于 date
之前 X 天且不迟于 date
并且结束时间不迟于 date
之后 X 天的文档>。
..._view/by_start_date?startkey=[date-X,]&endkey=[date, date+X]
您可以将类似的逻辑应用于 by_end_date View 。
关于javascript - Couchdb Map函数获取两个日期之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23509270/