带有 orderBy 的 firestore 相等过滤器

zee*_*zee 4 firebase google-cloud-firestore

我正在使用 Firestore 并且我有非常简单的带有相等过滤器的查询,我需要在其中执行 orderBy (因为我必须限制结果)。我不能在没有 orderBy 的情况下使用 startAfter,因为在这种情况下 Firebase 会引发错误。

FirebaseError:提供给 Query.startAfter() 的参数太多。参数的数量必须小于或等于 Query.orderBy() 子句的数量

但是,我不能将 orderBy 与相等过滤器一起使用。例子:

query.where('tags.supporter', '==', true).orderBy('tags.supporter');
Run Code Online (Sandbox Code Playgroud)

这会引发 Firebase 错误:

FirebaseError:Order by 子句不能包含具有相等过滤器 tags.supporter 的字段

很有趣,这很好用:-

query.where('tags.supporter', '<=', true).where('tags.supporter', '>=', true)
Run Code Online (Sandbox Code Playgroud)

^ 这有效并为我提供了tags.supporter == true,但我不能将它与多个过滤器一起使用。

例子:

query.where('tags.supporter', '==', true).where('tags.volunteer', '==', true)
Run Code Online (Sandbox Code Playgroud)

^ 有效,但我不能在没有 orderBy 的情况下使用 startAfter。但是,如果我尝试使用 orderBy,则会出现错误:-

query.where('tags.supporter', '==', true).where('tags.volunteer', '==', true).orderBy(...)
Run Code Online (Sandbox Code Playgroud)

^ 不起作用!

我不能做 <= >= hack,因为它需要复合索引,但我不能设置它,因为这些是用户添加的标签。

有任何想法吗?

如果这确实是一个限制,那么应该在文档中明确提及它,因为它会影响我的决定。现在,如果这确实是一个限制,我将不得不在我自己的应用程序中构建大量逻辑来过滤结果。

cod*_* up 7

假设给你一个包含10 个元素的数组,每个元素的值为 '5' 。现在您必须对数组进行排序(或者说,orderBy ascending ),您将如何执行此操作。答案是“已经排序”。

同样,您的查询首先对age进行过滤,然后对同一属性(即age)进行orderBy过滤。它与范围过滤器配合使用效果很好,因为它包含完整的年龄范围,并最终包含要orderBy的内容。age>=7age<=7

query.where("age", "<=", 7).where("age", ">=", 7).orderBy("age)

具有相等性的过滤器(关于年龄)返回一个数据查询集,其具有与应用过滤器的属性相同的值,即返回的查询集中的每个数据对象都具有统一的年龄,在年龄的基础上没有区别(是的,您肯定可以而且应该在其他属性上应用orderBy )。


zee*_*zee 7

经过大量的试验和错误,我想通了。

您可以使用.orderBy(firebase.firestore.FieldPath.documentId()). 这允许您使用多个相等过滤器,并且仍然可以执行 limit 和 startAfter。

  • 听起来您可能没有尝试使用文档快照而不是字段值的 startAfter 版本。由于您没有显示使用 startAfter 的实际代码,我们真的不知道您的问题到底出了什么问题。 (2认同)