关于javascript:Couchdb Map函数来获取两个日期之间的数据

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传递timestamp(key),如果它在start_timeend_time之间,那么我想获取文档。

例子:

假设URL是这样的

1
   .../trip/_design/trip/_view/trip?key="Jan 10, 2014 8:46:00 AM"

在这里,我将时间戳作为Jan 10, 2014 8:46:00 AM传递,因此它位于上述文档的start_timeend_time之间,在这种情况下,我需要获取其余信息。

请帮我解决这个问题,这对我很有帮助。

我的写作功能如下:

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的文档

排序问题

根据类型,索引键将按字母顺序或整数排序。因此,如果您的视图trip使用这样的启动键:

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_datetrip/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);
    }

如果您对开始时间和结束时间之间的最大差异有更多的详细信息,可以使用它进一步减少每个集合中的文档。以下示例将返回不迟于date之前x天、不迟于date之后x天、不迟于date之后x天的文档。

1
    ..._view/by_start_date?startkey=[date-X,]&endkey=[date, date+X]

您可以将类似的逻辑应用于by-end-date视图。