Firestore查询需索引报错排查:已创建索引仍出现问题?
我注意到一个关键细节:你的错误日志里显示的查询是 Query(userChat where to == M-00710 order by -messageDate, -name ),但你贴出来的代码里只对messageDate做了降序排序,完全没涉及name字段的排序。这大概率就是问题所在,下面给你梳理几个排查方向:
排查代码中的其他查询逻辑
仔细检查整个项目代码,有没有其他地方对userChat集合执行了同时过滤to字段,并且同时按messageDate(降序)和name(降序)排序的查询?错误日志里的查询明确包含了-name(即name字段降序),但你当前提供的代码里没有这部分逻辑,这说明要么是你漏贴了相关代码,要么是其他地方的查询触发了这个索引需求。验证你创建的索引是否匹配查询需求
错误提示里的查询需要的是复合索引:to字段(相等匹配) +messageDate(降序) +name(降序)。如果你创建的索引只包含to和messageDate,那完全不满足这个查询的要求,自然还是会报错。去Firebase控制台的索引页面确认一下,你的索引是不是包含了这三个字段的正确组合和排序方向。等待索引生效并刷新应用状态
Firestore的复合索引创建后,有时候需要5-10分钟才能完全生效,尤其是第一次创建这类索引的时候。可以先等一会儿,然后重启你的应用(最好清除一下应用缓存),避免客户端缓存了旧的查询状态导致依然报错。检查控制台里的索引状态
登录Firebase控制台,找到Firestore的索引页面,查看你创建的索引状态是不是已启用(Enabled)。如果它还显示“正在创建中”,那必须等它完成后再测试。
另外,如果你确定自己的业务逻辑只需要按messageDate排序,那一定要确保没有任何代码里额外加了orderBy('name', descending: true)这样的语句——比如有没有可能是你之前调试时加了这行代码,后来没删掉?
内容的提问来源于stack exchange,提问作者Boby

