Couchdb Map function to get the data in between two dates
我在我的国家数据库中有一组文档,这里我提到了一个示例文档:
1 2 3 4 5 6 7 8 9 | { "_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传递
例子:
假设URL是这样的
1 | .../trip/_design/trip/_view/trip?key="Jan 10, 2014 8:46:00 AM" |
在这里,我将时间戳作为
请帮我解决这个问题,这对我很有帮助。
我的写作功能如下:
1 2 3 4 5 6 | 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如下:
1 | ../trip/_design/trip/_view/trip?startkey=[1390086890000]&endkey=[1390086890000,{}] |
根据我的要求,以上一项是正确的吗????
不幸的是,这是不可能的。你的要求有两个问题。
视图按键排列
您可以编写这样的视图,分别使用start键和end键为文档编制索引。
1 2 3 | function(doc){ emit(doc.start_time, doc_id); // amend with end key to index by end key. } |
您可以在查询中使用三个参数:
- 键-与精确键匹配
- start key-匹配所有大于或等于start key的文档
- end key-匹配所有大于或等于end key的文档
排序问题
根据类型,索引键将按字母顺序或整数排序。因此,如果您的视图
1 | .../trip/_design/trip/_view/trip?start_key="Jan 10, 2014 8:46:00 AM" |
您可以返回大于或等于字符串"2014年1月10日…"的所有值,对于"2014年1月11日"或"2014年1月31日",这将是正确的,但对于"2011年7月22日"将有误报,对于"2014年2月1日"将有误报,因为f 要解决此问题,您必须将开始日期转换为可以按时间顺序排序的内容,例如:
- 分析日期到日期的时间,然后转换为epoch,就像如何用javascript获取自Unix epoch以来的时间(毫秒)?
- 将日期转换为yymmddhhmmss格式,如20140110084600
这两种方法都能正确分类。
你能解决你的问题吗
是的,但是有一点客户端代码。食谱如下:
- 创建两个视图
trip/by_start_date 和trip/by_end_date ,分别将开始日期和结束日期作为键返回。按照上面第二部分的排序方式。 - 得到两套文件。
- 集合1应返回在您的日期之前开始的所有文档:
..._view/by_start_date?endkey=[your_date] 。 - 集合2应返回在您的日期之后结束的所有文档:
..._view/by_end_date?startkey=[your_date] 。 - 然后,您有两组文档ID,您所追求的结果将是这两组文档中的那些文档。
进一步优化
在上面的解决方案中,返回的值可能太多。您可以使用CouchDB在多个值上进行键控的功能进一步减少它。按这样的开始日期和结束日期键入:
1 2 3 4 5 | 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); } |
如果您对开始时间和结束时间之间的最大差异有更多的详细信息,可以使用它进一步减少每个集合中的文档。以下示例将返回不迟于
1 | ..._view/by_start_date?startkey=[date-X,]&endkey=[date, date+X] |
您可以将类似的逻辑应用于by-end-date视图。