Couchdb Map函数用于获取两个日期之间的数据

时间:2014-05-07 05:16:55

标签: javascript mapreduce couchdb

我在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",
}

如果我从网址传递timestamp(key),如果它位于start_timeend_time之间,那么我想获取文档。

示例:

假设网址会像这样

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

此处我将时间戳记作为Jan 10, 2014 8:46:00 AM,因此它位于上述文档的start_timeend_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);
    }

并按以下方式调用网址:

../trip/_design/trip/_view/trip?startkey=[1390086890000]&endkey=[1390086890000,{}]

根据我的要求高于一个???

1 个答案:

答案 0 :(得分:4)

遗憾的是,这是不可能的。您的要求有两个问题。

视图按键排列

您可以编写这样的视图,分别通过开始键或结束键索引文档。

    function(doc){
      emit(doc.start_time, doc_id); // amend with end key to index by end key.
    }

您可以在查询中使用三个参数:

  • 键 - 匹配一个确切的键
  • startkey - 匹配所有大于或等于起始键的文档
  • endkey - 匹配所有大于或等于结束键的文档

排序问题

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

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

您可以返回大于或等于字符串“2014年1月10日......”的所有值,这对于“2014年1月11日”或“2014年1月31日”都是正确的,但是“7月”会出现误报“2011年2月1日”的22或“假阴性”为F<学家

要解决此问题,您必须将开始日期转换为可按时间顺序排序的内容,例如:

这两个都会正确排序。

你能解决问题吗

是的,但是有一点客户端代码。这是食谱:

  • 创建两个视图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键入多个值来进一步减少它。按开始和结束日期键入:

    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视图应用类似的逻辑。