Firestore多条件orderBy查询未返回预期结果求助
Firestore多条件查询排序异常解决方案
你的问题出在orderBy的优先级顺序上:Firestore会按你指定的orderBy顺序依次排序,第一个排序字段是主优先级,只有当该字段值相同时,才会使用第二个字段排序。
你当前的代码先按year升序排序,再按total降序排序,这意味着所有符合条件的文档会先按年份从早到晚排列,同一年份内才会按total从高到低排。这就导致高total但年份较晚的文档被压在后面,不符合你要按total降序取榜首的需求。
修正代码
调整orderBy的顺序,把total降序作为主排序条件,year排序作为可选的次条件(如果需要在total相同时按年份排序的话),同时直接用limit(1)获取排名第一的结果:
try { const mvResults = this.afs.collection(`leader_board`, ref => ref .where('year', '>=', '1990') .where('event', '==', 'WAVUST') .where('body', 'in', ['Panelvan', 'SM Van', 'XL Van']) .orderBy('total', 'desc') // 主排序:按total从高到低 .orderBy('year') // 次排序:total相同时按年份升序(可根据需求删除) .limit(1)) // 仅获取排名第一的文档 .valueChanges() this.topModVan$ = mvResults.subscribe(data => { this.topModernVanDS = new MatTableDataSource(data); console.log('Top Modern Van: ' + JSON.stringify(data)); }) } catch (error) { console.log('Top Modern Van Error: ' + error.message); }
注意事项
修改orderBy顺序后,Firestore可能会要求你创建对应的复合索引。如果控制台报错,直接点击错误信息里的链接,就能自动跳转到Firestore控制台创建所需的索引,完成后查询即可正常工作。
内容的提问来源于stack exchange,提问作者Michael Cockinos
相关产品推荐
相关产品推荐

