在同一查询中使用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');
}
}
答案 0 :(得分:0)
orderBy和startAfter或startAfterDocuments应该在同一字段上执行。
在上面的问题中,我对finalTimeStamp字段执行了orderBy,并使用startAfterDocument,它在订购文档时会考虑文档ID。因此,firestore会引发错误。
您可以通过两种方式解决此问题:
您可以在finalTimeStamp字段上执行startAfter()。 (我的情况没有考虑这一点,因为我可能有多个具有相同finalTimeStamp的文档。使用它可能会给出错误的结果)
我在引用同一文档的文档中创建了chatRef字段。然后,我在firestore中创建了一个索引,以便通过finalTimeStamp首先对文档进行排序,然后再通过chatRef进行排序。现在,在查询时,我对finalTimeStamp和chatRef以及startAfterDocument()进行了两次orderBy()。