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,因为它需要复合索引,但我不能设置它,因为这些是用户添加的标签。
有任何想法吗?
如果这确实是一个限制,那么应该在文档中明确提及它,因为它会影响我的决定。现在,如果这确实是一个限制,我将不得不在我自己的应用程序中构建大量逻辑来过滤结果。
假设给你一个包含10 个元素的数组,每个元素的值为 '5' 。现在您必须对数组进行排序(或者说,orderBy ascending ),您将如何执行此操作。答案是“已经排序”。
同样,您的查询首先对age进行过滤,然后对同一属性(即age)进行orderBy过滤。它与范围过滤器配合使用效果很好,因为它包含完整的年龄范围,并最终包含要orderBy的内容。age>=7age<=7
query.where("age", "<=", 7).where("age", ">=", 7).orderBy("age)
具有相等性的过滤器(关于年龄)返回一个数据查询集,其具有与应用过滤器的属性相同的值,即返回的查询集中的每个数据对象都具有统一的年龄,在年龄的基础上没有区别(是的,您肯定可以而且应该在其他属性上应用orderBy )。
经过大量的试验和错误,我想通了。
您可以使用.orderBy(firebase.firestore.FieldPath.documentId()). 这允许您使用多个相等过滤器,并且仍然可以执行 limit 和 startAfter。
| 归档时间: |
|
| 查看次数: |
6492 次 |
| 最近记录: |