javascript - Couchdb Map函数获取两个日期之间的数据

标签 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",
}

如果我从 URL 传递 timestamp(key),如果它在 start_timeend_time 之间,那么我想获取文档.

例子:

假设 url 是这样的

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

调用 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.

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

这两个都会正确排序。

你能解决你的问题吗

是的,但需要一些客户端代码。这是食谱:

  • 创建两个 View trip/by_start_datetrip/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/

相关文章:

java - 为什么我无法在 Hadoop 中获取 FileName 并以格式(Word 文件名计数)显示它?

hadoop - 从 RecordReader/InputFormat 访问作业的配置

couchdb - CouchDB 中奇怪的映射减少行为。减少?

javascript - 简单对象字面量和嵌套对象字面量之间的区别

javascript - 在图像 url 中添加 javascript 变量

javascript - Angularjs 隐藏输入字段内的文本

在 couchdb 中搜索或通过 Elasticsearch 进行 river

javascript - 如何将这个 javascript 制作的表格添加到页面中?

包含修订历史记录的 CouchDB View

caching - 内存缓存的 NoSQL 替代品