在查询中使用orderBy和startAfterDocument时出错

时间:2019-06-06 00:24:37

标签: firebase flutter dart google-cloud-firestore

在同一查询中使用orderBy和startAfterDocument时,出现以下错误:

  

失败:状态{code = FAILED_PRECONDITION,描述=查询需要索引。您可以在这里创建它:https://console.firebase.goog ...

当我尝试接收下一组文档时,捕获了此错误。 尝试使用错误中提供的链接来创建索引,但是正在使用“ finalTimeStamp”字段生成单个索引,firestore抛出了以下异常。

this index is not necessary, configure using single field index controls

在我的单个字段索引中,集合范围的降序索引已启用。

我的代码:

    if (_lastVisible == null) {
      try {
        data = await chatList
            .document(widget.currentUserId)
            .collection('inbox')
            .orderBy('finalTimeStamp', descending: true)
            .limit(10)
            .getDocuments();
      } catch (e) {
        print('caught error 1');
      }
    } else {
      try {
        data = await chatList
            .document(widget.currentUserId)
            .collection('inbox')
            .orderBy('finalTimeStamp', descending: true)
            .startAfterDocument(_lastVisible)
            .limit(10)
            .getDocuments();
      } catch (e) {
        print('caught error 2');
      }
    }

1 个答案:

答案 0 :(得分:0)

orderBy和startAfter或startAfterDocuments应该在同一字段上执行。

在上面的问题中,我对finalTimeStamp字段执行了orderBy,并使用startAfterDocument,它在订购文档时会考虑文档ID。因此,firestore会引发错误。

您可以通过两种方式解决此问题:

  1. 您可以在finalTimeStamp字段上执行startAfter()。 (我的情况没有考虑这一点,因为我可能有多个具有相同finalTimeStamp的文档。使用它可能会给出错误的结果)

  2. 我在引用同一文档的文档中创建了chatRef字段。然后,我在firestore中创建了一个索引,以便通过finalTimeStamp首先对文档进行排序,然后再通过chatRef进行排序。现在,在查询时,我对finalTimeStamp和chatRef以及startAfterDocument()进行了两次orderBy()。