gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:16:19 27 4
gpt4 key购买 nike

我的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com