所有在查询窗口中结束的事件。
- 在查询窗口中启动的所有事件。
我有一个带有表'events'的RethinkDB,每个事件都有一个'from'和'to'列,都是时间戳。
我主要想通过返回时间窗口中所有“活动”的事件来查询该表,这意味着from列在时间窗口结束之前,而end列在时间窗口开始之后(开始时间窗口的表示当前时间,时间窗口的结束表示当前时间+ 2小时)。因此,我在两列上都创建了二级索引。
理想情况下,我希望将其作为单个changefeed接收,包括对事件的实时更改,还选择随着时间的推移而变得活跃的事件,但是根据我的判断,这是不可能的,因为根据docs“服务器接收到查询后,将立即计算一次now()命令(如果我输入错误,请更正),因此,我将每小时创建一个新的changefeed,以查询距当前时间2小时内的活动事件。
现在我首先想到我会在两次通话之间使用两个,例如
let currentEndpoint = moment().add(2, 'hours');
// query for active events
r
.table('events')
// event start is before end of window
.between(new Date(1), currentEndpoint, {index: 'from'})
// event end is after current time
.between(new Date(), r.epochTime(1900266776))
.run(connection)
.then(res => {
console.log(res)
})
.catch(e => {
console.error(e);
})
显然是不允许的:ReqlQueryLogicError: Cannot perform multiple BETWEENs on the same tabl
我知道用filter命令很容易做到这一点,但是由于这是我要查询表的主要方式,我认为使用索引会更好,有没有办法创建此查询?
可视示例
event2
\
_____\______
/ \
time: ---->---->---->---->---->---->---->---->---->---->----> ...
\__/ \__/ / \__/
event1___/ event3__/ / event5__/
event4_/
^ ^
query window: |______________|
expected results: [ event2, event3 ]
可再现的问题
创建events
表-
r.tableCreate("events");
// { tables_created: 1, ... }
添加一些事件。为了概念上的简单,我们只关注year
,month
和day
。解决问题的时间更细,例如hours
或minutes
实际上是相同的
r.table("events").insert([
{ name: "fishing tourney"
, from: r.time(2020, 1, 11, "Z")
, to: r.time(2020, 1, 12, "Z")
}
, { name: "cherry blossom"
, from: r.time(2020, 4, 1, "Z")
, to: r.time(2020, 4, 10, "Z")
}
, { name: "fishing tourney"
, from: r.time(2020, 4, 11, "Z")
, to: r.time(2020, 4, 12, "Z")
}
, { name: "bunny day"
, from: r.time(2020, 4, 1, "Z")
, to: r.time(2020, 4, 12, "Z")
}
, { name: "fishing tourney"
, from: r.time(2020, 7, 11, "Z")
, to: r.time(2020, 7, 12, "Z")
}
]);
// { inserted: 5, generated_keys: [ ... ], ... }
创建某种secondary index-
r.table("events").indexCreate(
"event_window",
???
);
给出日期范围,使用相交的事件窗口获取所有事件-
const start = r.time(2020, 4, 8, "Z"); // April 8, 2020
const end = start.add(3 * 24 * 60 * 60); // April 11, 2020, 3 days later
// filter it?
r.table("events").filter(???)...
// use .between somehow?
r.table("events").between(???, ???, { index: "event_window" })
// some other technique?
r.table("events").eqJoin(???)
r.table("events").???
与事件重叠的事件[2020年4月8日,2020年4月11日,2020年-]]// expected output
[ { name: "cherry blossom"
, from: r.time(2020, 4, 1, "Z")
, to: r.time(2020, 4, 10, "Z")
}
, { name: "fishing tourney"
, from: r.time(2020, 4, 11, "Z")
, to: r.time(2020, 4, 12, "Z")
}
]
我有一个带有表'events'的RethinkDB,每个事件都有一个'from'和'to'列,两者都是时间戳。我主要想通过返回时间窗口中所有“活动”的事件来查询该表,...
您将在结果集中返回的事件至少属于那些集合之一:所有在查询窗口中结束的事件。
在查询窗口中启动的所有事件。
(在查询窗口中开始和结束的事件都属于这两个集合) 如果您索引 from
和to
属性,则可以查询All events that ended in query window
,并将其与All events that started in query window
合并。您仍然可以为每组事件使用正确的索引。请记住对碰巧属于这两个事件的事件进行重复数据删除。
r.table("events").between(r.time(2020, 4, 8, "Z"), r.time(2020, 4, 11, "Z"), { index: "from", rightBound: "closed" }).union( r.table("events").between(r.time(2020, 4, 8, "Z"), r.time(2020, 4, 11, "Z"), { index: "to" }) ).distinct()
我不能说这是惯用的还是最好的方法,但是过去我不得不使用类似的方法。