我有这些数据:
[
...
{
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
}
}
}
}
};
现在我需要做的是匹配与今天相匹配的对象,并考虑startTime
和endDate
。因此,如果今天的日期为april 21 2017
且时间为15:00
,则上述两个对象都应匹配。
首先尝试没有开始和结束时间匹配,这个查询给了我数据库中的每个可能的对象,这是非常错误的。
我认为我必须在yesterday
和tomorrow
之间设置一个日期才能获得today
,使用getDate()
加一或减一。但这显然是错误的。
我该怎么做?
编辑:奇怪的是,如果我从查询中删除from
和size
,我会得到0结果..
答案 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(如果指定了时区)并存储为一个长数字,表示自此纪元以来的毫秒数。
答案 1 :(得分: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())
}
}
}
]
}
}
}
};
然而,这还没有考虑时区。