Firebase 如何在firestore中的两个字段之间进行查询?

Firebase 如何在firestore中的两个字段之间进行查询?,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,假设我有一个事件集合,其中startTimestamp和endTimestamp分别指示事件开始和结束的时间 如何在firestore中查询事件是否为live/finished/Uncoming?如果数据库中同时存在startTimestamp和endTimestamp属性,并且类型为Date和not字符串或数字,然后,您可以简单地使用查询来检查特定日期是否在范围内 例如,在Android中,如果您想检查某个特定日期是否在范围内,您可能会认为下面这样的查询可以工作: eventsRef.wher

假设我有一个事件集合,其中startTimestamp和endTimestamp分别指示事件开始和结束的时间


如何在firestore中查询事件是否为live/finished/Uncoming?

如果数据库中同时存在
startTimestamp
endTimestamp
属性,并且类型为
Date
not字符串或数字,然后,您可以简单地使用查询来检查特定日期是否在范围内

例如,在Android中,如果您想检查某个特定日期是否在范围内,您可能会认为下面这样的查询可以工作:

eventsRef.whereGreaterThanOrEqualTo("startTimestamp", yourDate)
    .whereLessThanOrEqualTo("endTimestamp", yourDate);
但不会。您将获得一个异常,并显示以下消息:

除WHEREQUALTO()之外的所有where筛选器必须位于同一字段上。但“startTimestamp”和“endTimestamp”上有过滤器

唯一的解决办法是创建三个单独的查询

编辑:

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

eventsRef.whereLessThanOrEqualTo("startTimestamp", yourDate);
如果是,这意味着这是一个即将到来的事件

第二个问题是看它是否比
startTimestamp

eventsRef.whereGreaterThanOrEqualTo("startTimestamp", yourDate);
eventsRef.whereLessThanOrEqualTo("endTimestamp", yourDate);
我们有两个案子。在一种情况下,执行新的(第三个)查询以检查数据是否小于
endTimestamp

eventsRef.whereGreaterThanOrEqualTo("startTimestamp", yourDate);
eventsRef.whereLessThanOrEqualTo("endTimestamp", yourDate);
如果是,则表示该事件在范围内,因此它是一个实时事件,否则比表示该事件已完成的事件更严重


要实时获取数据,您应该为每个查询使用快照侦听器。

以下是处理此场景的案例。我很确定这是一个非常普遍的问题,但没有找到有效的解决办法

解决方案1:将所有文档放在一个名为subscribedEvents的集合中 正如Alex所建议的,我们需要为以下状态执行操作

即将推出的:当前时间戳 完成:currentTimestamp>endTimestamp

Live:currentTimestamp>startTimestamp在第一次查询中,currentTimestamp 问题:我可以在subscribedTimestamp中有很多文档(将近10000个),并且Live condition不可伸缩,因为我无法在查询时限制结果。由于它需要与这两个查询相交,所以我需要使用out过滤器进行查询

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

当用户订阅时,如果是即将到来的事件,您可以直接将其存储在subscribedEvents/others/Uncoming集合中

其余文档可以直接进入subscribedEvents集合

即将推出的:使用限制过滤器从subscribedEvents/others/Uncoming集合查询所有文档

完成:currentTimestamp>endTimestamp

实时:currentTimestamp 这种结构的好处是我们可以应用限制过滤器,您的查询不需要阅读大量文档,每个状态只需要一个查询

现在,此步骤还需要一个cron作业,以确保即将到来的子集合中的即将到来的事件移回subscribedEvents

但是,如果您有较少的文档,那么解决方案1是一个不错的选择。但我的情况并非如此


希望它能帮助那些需要高效扩展的人。

您一次只能查询其中一种状态-您无法从一个查询中获得所有三种状态。你所要求的不是很复杂,我建议你尝试一下,然后在这里用你期望的不正常的代码发帖。我正在寻找状态一次一个。我尝试了不同的组合,主要是受不同领域的不等式算子的限制。如果我需要实时状态,我需要查询>startTimestamp,有一个很好的答案,但问题需要澄清。当您定义“即将到来的”事件时,这意味着什么?你想知道从现在到时间结束的每一件事吗?还是下周埃弗茨?下个月?只是下一个事件?还有,当你问关于生活-生活根据什么?因此,用户按下按钮并显示当前时间在开始时间之后和结束时间之前的所有事件?你想不想让他们按一个按钮,而想用其他的机制?即将到来的状态意味着活动将在某个时候开始。直播意味着事件正在发生。完成表示事件日期已完成。这里假设事件是在某个地方举行的开发人员会议。我想通过firestore查询知道哪些事件是实时的(当前正在发生)或哪些事件即将发生。您能解释一下三个单独的查询是什么意思吗?对于EX:请考虑获得现场状态。谢谢你的回答。一旦我们对Live case执行了2次查询,我如何对其应用限制过滤器,因为api是这样的-getSubscribedEvents(限制:10,偏移量:0,Status.Live);要限制结果,只需使用
limit()
调用并传递您想要的确切限制,例如
limit(10)
。但一旦我们完成这两个查询的交集,这可能不会给出预期的最大结果计数。它没有回答限制部分,但我需要接受所述的解决方案,这是唯一的方法。然而,我有另一个解决方案,它是有效的,并且通过对subscribedEvents集合进行微小的结构更改来解决限制问题。稍后将尝试发布。