我正在使用具有以下结构的Firebase Cloud Firestore datadabse构建应用程序:
我正在查询用户的书籍,其中“ StartDate”字段大于0,而“ EndDate”等于0,则应按标题对查询进行排序。
CollectionReference booksCollection = mFirebaseDatabase.collection("users").document(user.getUid()).collection("books");
Query databaseQuery = booksCollection.whereGreaterThan("StartDate", 0).whereEqualTo("EndDate", 0).orderBy("Title");
databaseQuery.get()
为此,我读到您需要使用索引(尽管我没有得到指向错误消息中索引的链接,因为它表明我应该这样做)。我的索引看起来像这样:
但是我收到错误消息:
java.lang.IllegalArgumentException:无效的查询。您在字段'StartDate'上有一个不等式的where过滤器(whereLessThan(),whereGreaterThan()等),因此您还必须将'StartDate'作为第一个orderBy()字段,但是您的第一个orderBy()当前在字段上改为“标题”。
答案 0 :(得分:1)
Firestore查询只能在单个字段上对范围进行排序或过滤。您正在尝试对StartDate
进行过滤,然后对Title
进行订购,这是不可能的。
Firestore documentation on queries包含以下类似的不允许查询的示例:
无效:范围过滤器和一阶按不同字段
citiesRef.whereGreaterThan("population", 100000).orderBy("country");
Firestore仅允许查询满足其性能保证的条件,并且不允许(当前)对多个字段进行排序/范围过滤。请参阅Todd的video on Firestore queries,以了解有关其工作原理的更多信息。
典型的解决方法是让Firestore处理过滤器(在您的情况下为StartDate
,然后在Android应用中将结果重新排序。