带有 <= & >= 的 Firestore 复合查询

Jon*_*nas 10 firebase google-cloud-firestore

我需要在 Firestore 集合中查询开始时间(这是一个数字)是>= slot.startand 的条目<= slot.end

像这样:

.collection('Entries', ref => ref.where('timeStart', '>=', slot.timeStart).where('timeEnd', '<=', slot.timeEnd))
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

Invalid query. All where filters with an inequality (<, <=, >, or >=) must be on the same field.

我认为这个查询可以与复合索引一起使用,但正如错误所说,这不起作用。

当我将查询更改为:

.collection('Entries', ref => ref.where('timeStart', '==', slot.timeStart).where('timeEnd', '<=', slot.timeEnd))
Run Code Online (Sandbox Code Playgroud)

我可以为它创建一个索引。此外,当我将第二个 '<=' 更改为 '==' 时,我什至不需要它的索引。

我不认为我的查询那么高级,我对 firestore 无法执行此查询感到有些失望。那么我的问题的最佳解决方案是什么?像这样省略第二个查询语句是下一个最好的选择

.collection('Entries', ref => ref.where('timeStart', '>=', slot.timeStart))
Run Code Online (Sandbox Code Playgroud)

然后遍历结果并检查是否timeEnd <= entry.timeEnd“手动”?这对我来说似乎是一个非常糟糕的解决方案,因为那时我可能需要加载大量数据。

Ron*_*ton 18

您将不得不选择一个字段并查询该字段,然后在客户端过滤掉另一个字段。复合查询文档在这一点上是坚定的。

您只能对单个字段执行范围比较 (<, <=, >, >=),并且您最多可以在复合查询中包含一个 array_contains 子句:

  • 嗯,糟透了:/。但我想我别无选择。不管怎么说,多谢拉! (13认同)
  • 很糟糕,我喜欢我们被告知不要这样使用 sql,这里有一个我们无法理解的简单查询 (8认同)
  • 这是我第一次使用 firestore,我想这将是最后一次。这是firestore的一个很大的缺陷。他们认为开发人员会如何使用过滤器和查询 (3认同)