带orderBy的firestore相等过滤器

时间:2019-09-07 01:48:54

标签: firebase google-cloud-firestore

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

  

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

但是,我不能在等式过滤器中使用orderBy。示例:

query.where('tags.supporter', '==', true).orderBy('tags.supporter');

这会引发Firebase错误:

  

FirebaseError:Order by子句不能包含具有相等性的字段   过滤标签。支持者

很有趣,这很好用:-

query.where('tags.supporter', '<=', true).where('tags.supporter', '>=', true)

^这可以正常工作,并为我提供了tags.supporter == true,但是我不能将其与多个过滤器一起使用。

示例:

query.where('tags.supporter', '==', true).where('tags.volunteer', '==', true)

^可以工作,但是没有orderBy我不能使用startAfter。但是,如果我尝试使用orderBy,则会收到错误消息:-

query.where('tags.supporter', '==', true).where('tags.volunteer', '==', true).orderBy(...)

^不起作用!

我无法进行<=> = hack,因为它需要复合索引,但是由于这些是用户添加的标签,因此无法进行设置。

有什么想法吗?

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

2 个答案:

答案 0 :(得分:1)

假设您得到一个由10个元素组成的 array ,每个元素的值均为'5'。现在,您必须对数组进行排序(或者说 orderBy 升序),如何进行排序。答案是其“ 已排序”。

您的 Query 具有相同的属性,即首先在 age 上具有 filter ,然后在同一属性(即age)上具有 orderBy 。 它可以与范围过滤器age>=7age<=7配合使用,因为它包含了完整的年龄范围,并最终包含了 orderBy

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

相等的过滤器(在 age 上)会向您返回一个 queryset 数据,该数据具有与您应用过滤器的属性相同的值 ,也就是说,您返回的 queryset 中的每个数据对象都具有相同的年龄,没有基于年龄的区别(是的,您可以并且应该在其他属性上应用 orderBy 当然)。

答案 1 :(得分:1)

经过反复试验,我弄清楚了。

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