【问题标题】:Firestore "Invalid query" - Am I using Indexing wrong?Firestore“无效查询”-我使用索引错误吗?
【发布时间】:2019-01-17 21:42:59
【问题描述】:

我正在使用具有以下结构的 firebase cloud firestore datadabse 构建应用程序:

我正在查询“StartDate”字段大于 0 且“EndDate”等于 0 的用户书籍,然后该查询应按 Title 排序。

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”上有一个不等式过滤器(whereLessThan()、whereGreaterThan() 等),因此您还必须将“StartDate”作为您的第一个 orderBy() 字段,但您的第一个 orderBy() 目前在字段上改为“标题”。

【问题讨论】:

    标签: android firebase indexing google-cloud-firestore


    【解决方案1】:

    Firestore 查询只能对单个字段的范围进行排序或过滤。您尝试在StartDate 上进行过滤,然后在Title 上订购,这是不可能的。

    Firestore documentation on queries 包含类似的不允许查询示例:

    无效:范围过滤器和不同字段上的一阶排序

    citiesRef.whereGreaterThan("population", 100000).orderBy("country");
    

    Firestore 仅允许查询能够满足其性能保证的查询,以及对(当前)不可能的多个字段进行排序/范围过滤。请参阅 Todd 的 video on Firestore queries 以了解有关其工作原理的更多信息。

    典型的解决方法是让 Firestore 处理过滤器(在您的情况下为 StartDate,然后在 Android 应用中重新排序结果。

    【讨论】:

    • 我认为索引允许这样做?
    • 它允许过滤多个字段的相等性,但只允许对单个字段进行排序/范围过滤。请参阅我链接的视频以了解原因。
    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 2016-11-26
    • 2017-06-30
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多