考虑到我有一个Events集合,其中有startTimestamp和endTimestamp分别指示事件何时开始,结束。
如何在Firestore中查询事件是否是直播/结束/即将到来?
答案 0 :(得分:1)
如果数据库中同时存在startTimestamp
和endTimestamp
属性并且类型为Date
且不字符串或数字,那么您可以简单地使用查询检查特定日期是否在范围内。
例如在Android中,如果您要检查某个特定日期是否在范围之内,您可能会认为类似以下查询的查询将起作用:
eventsRef.whereGreaterThanOrEqualTo("startTimestamp", yourDate)
.whereLessThanOrEqualTo("endTimestamp", yourDate);
但是不会。您将收到以下消息的异常:
除whereEqualTo()以外的所有其他过滤器都必须位于同一字段上。但是您在'startTimestamp'和'endTimestamp'上有过滤器
您唯一的解决方案是创建三个单独的查询。
编辑:
根据您的评论,一个查询应检查您的yourDate
是否在startTimestamp
之前
eventsRef.whereLessThanOrEqualTo("startTimestamp", yourDate);
如果是,则表示这是即将发生的事件。
第二个是看它是否比startTimestamp
更磨碎:
eventsRef.whereGreaterThanOrEqualTo("startTimestamp", yourDate);
我们有两种情况。在一种情况下,您执行一个新的(第三种)查询以检查数据是否小于endTimestamp
:
eventsRef.whereLessThanOrEqualTo("endTimestamp", yourDate);
如果是,则表示该事件在范围之内,因此这是一个直播事件,否则比表示事件已结束的事件要好。
要实时获取该数据,您应为每个查询使用快照侦听器。
答案 1 :(得分:0)
以下是处理这种情况的情况。我敢肯定这是一个非常普遍的问题,但是在任何地方都找不到有效的解决方案。
解决方案1 :将所有文档放在一个称为subscriptiondEvents的集合中 正如Alex所建议的,我们需要为以下状态做。
即将:currentTimestamp 完成:currentTimestamp> endTimestamp 实时:第一个查询中的currentTimestamp> startTimestamp,第二个查询中的currentTimestamp 问题:SubscribedTimestamp中可以有很多文档(将近10,000个),并且Live条件无法扩展,因为我无法在查询时限制结果。由于它需要与两个查询相交,因此我需要不使用过滤器进行查询。 解决方案2 :这有点hack,但可扩展。不要将所有文档都放在一个子集合中。分开即将发生的事件,并将这些文档放在subscriptionedEvents / others /即将出现的集合中。 用户订阅时,如果它是即将发生的事件,则可以直接存储在subscriptiondEvents / others / Upcoming集合中。 其余文档可以直接进入subscriptiondEvents集合。 即将到来的:从subscriptiondEvents / others /即将到来的集合中查询带有限制筛选器的所有文档。 完成:currentTimestamp> endTimestamp 实时:currentTimestamp 这种结构的好处是我们可以应用限制过滤器,并且不需要为查询查询读取许多文档,并且每种状态只需要查询一个即可。 现在,此步骤还需要执行cron作业,以确保将来自即将到来的子集合的即将到来的事件移回subscribedEvents。 但是,如果您的文档较少,则可以采用解决方案1。但就我而言,不是。 希望它可以帮助需要有效扩展的人员。