在多个字段上使用不等式过滤器进行 Firestore 查询

Vul*_*lps 5 firebase swift google-cloud-firestore

我正在使用 Swift 在 IOS 上构建一个日历,并使用 Firestore 后端。

我一次检索一个月中每一天的所有事件。

目前我只能显示在特定日期开始的事件。

如果活动在周五晚上开始并在周一早上结束(想想周末假期),那就不好了。

所以...

我需要Event从 Firestore 获取所有文档,其中当前填充事件的日期位于Firestore 文档上的start和字段的时间戳之间。end

显而易见的第一选择是这样的:

db.collection("Event")
            .whereField("user", isEqualTo: userID)
            .whereField("start", isLessThanOrEqualTo: thisDate)
            .whereField("end", isGreaterThanOrEqualTo: thisDate)
            .getDocuments()
Run Code Online (Sandbox Code Playgroud)

但事实证明 Firebase 不允许我在不同的字段上运行 2 个不等式过滤器 [:(

我能想到的唯一的其他选择是获取今天之前开始的所有事件,扫描每个事件并检查它是否在今天之前结束,然后显示其余的事件。

但这似乎效率不高,尤其是考虑到 5 年后,用户可能一年中的每一天都会发生一个事件(需要在短时间内检查大量文档)。

有人对我如何做到这一点有任何建议吗?

谢谢 :)

更新

我忘了添加这个,这是数据库结构的屏幕截图:)

(请注意day,由于我已经开始使用时间戳,因此month、 和year已过时)

在此输入图像描述

Far*_*bar 2

Firestore 具有查询限制,仅允许在同一字段上进行不等式过滤:

在复合查询中,范围 ( <, <=, >, >=) 和不等于 ( !=, not-in) 比较必须全部针对同一字段进行筛选。

不幸的是,它看起来不像谷歌方面可以改变的东西,因为实现当前设计有某些原因,例如查询速度。

在这种情况下,您将需要使用您在代码中提出的解决方案。

  • 这是 Firestore 限制第三次导致我选择效率较低的信息检索方法……。我开始怀疑 noSQL 是否真的适合目的……或者我是否应该回到关系数据库并重写我的应用程序的数据检索部分 (4认同)