【问题标题】:Firestore query with inequality filters on multiple fieldsFirestore 查询在多个字段上具有不等式过滤器
【发布时间】:2021-10-21 22:56:32
【问题描述】:

我正在使用带有 Firestore 后端的 Swift 在 IOS 上构建日历。

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

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

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

所以...

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

显而易见的首选是这样的:

db.collection("Event")
            .whereField("user", isEqualTo: userID)
            .whereField("start", isLessThanOrEqualTo: thisDate)
            .whereField("end", isGreaterThanOrEqualTo: thisDate)
            .getDocuments()

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

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

但这似乎不是很有效,特别是如果您考虑到 5 年后用户可能在一年中的每一天都有一个事件(那是 很多 文档要检查在很短的时间内通过)。

有人对我如何做这件事有任何建议吗?

谢谢:)

更新

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

(请注意,daymonthyear 是过时的字段,因为我已经开始使用时间戳)

【问题讨论】:

  • 如果不按end 字段过滤,您的查询是否有效?如果是,请您详细说明为什么这种方法不适合您?
  • 将事件填充到日历上的函数循环遍历“天”数组(28、30 或 31 次,具体取决于月份)...我只想检索当前日期在开始时间和结束时间之间或之间.....
  • @FaridShumbar 如果我错了请纠正我,但如果我认为规模较大,我不想通过检索在now 之前具有start 时间的每个事件来减慢应用程序的速度(从现在起 10 年后,对于 1 个用户来说,这可能是多少个文档?...加上用户被邀请参加的事件)...在查询中指定 end 时间将消除所有已经结束的事件,减少对应用的需求

标签: swift firebase google-cloud-firestore


【解决方案1】:

Firestore 有 query limitations,它只允许在同一字段上过滤不等式:

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

不幸的是,它看起来在 Google 方面无法更改,因为实施当前设计有某些原因,例如查询速度。

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

【讨论】:

  • 你好@Andy。这是answer your question吗?
  • 不幸的是,我的解决方案与我的代码中的解决方案不同,但我希望有人有一些“生活技巧”来减轻应用程序的负担?
  • 这是 Firestore 限制第三次使我选择了一种效率较低的信息检索方法……。我开始怀疑 noSQL 是否真的适合……或者我是否应该回到关系数据库并重写我的应用程序的数据检索部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多