firebase 如何在firestore中查询两个字段?

pgky5nke  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(111)

假设我有一个Events集合,其中startTimestamp和endTimestamp分别指示事件何时开始和何时结束。
如何在firestore中查询事件是否是直播/结束/即将到来?

jq6vz3qz

jq6vz3qz1#

如果startTimestampendTimestamp属性都存在于数据库中,并且是Date类型,不是String或Number,那么您可以简单地使用查询来检查特定日期是否在边界内。
例如,在Android中,如果您想检查特定日期是否在边界内,您可能会认为下面的查询可以工作:

eventsRef.whereGreaterThanOrEqualTo("startTimestamp", yourDate)
    .whereLessThanOrEqualTo("endTimestamp", yourDate);

字符串
但不会的您将得到一个异常,并显示以下消息:
除whereEqualTo()之外的所有where过滤器必须在同一字段上。但是你在'startTimestamp'和'endTimestamp'上有过滤器
唯一的解决方案是创建三个独立的查询。

编辑:

根据您的评论,一个查询应该检查您的yourDate是否在startTimestamp之前

eventsRef.whereLessThanOrEqualTo("startTimestamp", yourDate);


如果是,那就意味着这是一个即将到来的事件。
第二个是看看它是否比startTimestamp更大:

eventsRef.whereGreaterThanOrEqualTo("startTimestamp", yourDate);


我们有两个案子。在一种情况下,您执行一个新的(第三个)查询来检查数据是否小于endTimestamp

eventsRef.whereLessThanOrEqualTo("endTimestamp", yourDate);


如果是,则意味着事件在边界内,因此它是一个实时事件,否则比意味着事件完成的事件更大。
要实时获取这些数据,您应该为每个查询使用快照侦听器。

b1zrtrql

b1zrtrql2#

以下是处理这种情况的案例。我敢肯定这是一个非常常见的问题,但没有找到有效的解决方案,这在任何地方。

解决方案1:让所有文档都在一个名为subscribedEvents的集合中。正如Alex建议的那样,我们需要为以下状态做些什么。
即将推出:当前时间戳<开始时间戳
已完成:当前时间戳>结束时间戳
Live:第一个查询中的当前时间戳>开始时间戳,第二个查询中的当前时间戳<结束时间戳。

问题:我可以有很多文档(近10,000个)在subscribedTimestamp和实时条件是不可伸缩的,因为我不能限制查询结果。因为它需要从两个查询中相交,所以我需要使用out过滤器进行查询。

解决方案2:这是一个有点黑客,但可伸缩。不要将所有文档都放在一个子集合中。将即将发生的事件分开,并将这些文档放在subscribedEvents/others/Upcoming集合中。

当用户订阅时,如果它是一个即将到来的事件,可以直接存储在subscribedEvents/others/Upcoming集合中。
其余的文档可以直接放入subscribedEvents集合中。

即将推出:从subscribedEvents/others/Upcoming集合中使用限制筛选器查询所有文档。
已完成:当前时间戳>结束时间戳
实时:当前时间戳<结束时间戳

这种结构的好处是,我们可以应用限制过滤器,查询时无需读取大量文档,而且每个状态只需要一个查询。
现在,此步骤还需要一个cron作业,以确保即将发生的事件从即将发生的子集合移回subscribedEvents。
但是,如果您的文档较少,则可以使用解决方案1。但不是在我的情况下。
希望它能帮助那些必须高效扩展的人。

相关问题