如何在Firestore中的两个字段之间查询?

时间:2019-10-17 15:40:12

标签: firebase google-cloud-firestore

考虑到我有一个Events集合,其中有startTimestamp和endTimestamp分别指示事件何时开始,结束。

如何在Firestore中查询事件是否是直播/结束/即将到来?

2 个答案:

答案 0 :(得分:1)

如果数据库中同时存在startTimestampendTimestamp属性并且类型为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。但就我而言,不是。

希望它可以帮助需要有效扩展的人员。