2017-04-21 76 views
1

我有这样的数据:如何查询ISO日期为今天的对象?

[ 
    ... 
    { 
     date: { 
     startDate: '2017-04-21T00:00:00.000Z', 
     endDate: '2017-04-21T00:00:00.000Z', 
     startTime: '12:00', 
     endTime: '21:00' 
     } 
    }, 
    { 
     date: { 
     startDate: '2017-04-21T00:00:00.000Z', 
     endDate: '2017-04-21T00:00:00.000Z', 
     startTime: '09:00', 
     endTime: '23:00' 
     } 
    } 
    ... 
] 

这是我到目前为止有:

export const OngoingEventsQuery: any = { 
    type: 'event', 
    body: { 
    from: 0, 
    size: 2, 
    query: { 
     range: { 
     'date.startDate': { 
      gt: new Date().getDate() - 1 
     }, 
     'date.endDate': { 
      lt: new Date().getDate() + 1 
     } 
     } 
    } 
    } 
}; 

现在我需要做的,是要匹配符合今天的日期的对象,以及考虑到startTimeendDate。所以如果今天的日期是april 21 2017,时间是15:00,上述两个对象都应该匹配。

尝试没有开始和结束时间匹配,这个查询给了我数据库中的每一个可能的对象,这是错误的。

我想我必须给出yesterdaytomorrow之间的日期,以获得today,通过使用getDate()加上一个或一个。但这显然是错误的。

我该怎么做?

编辑:奇怪的是,如果我从查询中删除fromsize我得到0的结果..

+0

除非您无法控制进入ES的数据,否则我建议在索引时移动所有这些逻辑,并确保您在那里为正确的日期编制索引(包括小时/分钟)。 –

+0

@AndreiStefan我不能这样做,不幸的是,数据必须像这样存储和索引像这样:/ – Chrillewoodz

+0

没有人阻止你创建另一个字段(除了存在的字段),你有全时间戳用于这种范围匹配。我想说的是,解决这种类型的映射可能会影响你的查询性能。 –

回答

2
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "range": { 
      "date.startDate": { 
       "gte": "now/d", 
       "lte": "now/d" 
      } 
      } 
     }, 
     { 
      "range": { 
      "date.endDate": { 
       "gte": "now/d", 
       "lte": "now/d" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

the documentation日期将被保存在内部UTC,所以如果你比较会用UTC时间,你应该很好去:

在内部,日期转换为UTC(如果指定时区)并存储为一个长数字,表示毫秒自时代。

+0

看看我的其他答案,不需要很多脚本来让它工作:) – Chrillewoodz

+0

时区没有考虑到,但不知道我该怎么做。 – Chrillewoodz

0

只是建立在@ AndreiStefan的答案,包括时间就像添加两个range条件一样简单。因此,完整的查询如下所示:

export const OngoingEventsQuery: any = { 
    type: 'event', 
    body: { 
    from: 0, 
    size: 2, 
    query: { 
     bool: { 
     must: [ 
      { 
      range: { 
       'date.startDate': { 
       gte: 'now/d', 
       lte: 'now/d' 
       } 
      } 
      }, 
      { 
      range: { 
       'date.endDate': { 
       gte: 'now/d', 
       lte: 'now/d' 
       } 
      } 
      }, 
      { 
      range: { 
       'date.startTime': { 
       lte: datefns.getHours(new Date()) + ':' + datefns.getMinutes(new Date()) 
       } 
      } 
      }, 
      { 
      range: { 
       'date.endTime': { 
       gte: datefns.getHours(new Date()) + ':' + datefns.getMinutes(new Date()) 
       } 
      } 
      } 
     ] 
     } 
    } 
    } 
}; 

但是,这还没有考虑时区。