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

Couchdb Map function to get the data in between two dates

本文关键字:日期 两个 之间 数据 函数 Map 获取 Couchdb      更新时间:2023-09-26

我在我的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,{}]
根据我的要求,上面的

是正确的吗?

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

视图按键

排列

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

    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"

您可以返回大于或等于字符串"Jan 10, 2014…"的所有值,这对于"Jan 11, 2014"或"Jan 31, 2014"将为真,但是对于"July 22, 2011"将有假阳性或对于"Feb 01, 2014"将有假阴性,如F 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天结束的文档。

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

您可以对by_end_date视图应用类似的逻辑。