Firebase Firestore按字母顺序排序文档列表失败如何解决?
问题排查与修复方案
核心错误点
- 排序方向参数拼写错误:Firestore的升序排序参数是
asc,你的代码里写的是asce,无效参数会导致Firestore忽略排序规则,返回默认顺序 - 排序方向逻辑不统一:你期望得到
chicken→duck→pig的正序结果,但是type == 'All'分支里用的是desc倒序,会返回pig→duck→chicken的顺序,和预期不符 - 变量重复声明风险:你在
sortformat == 'name'分支里先给snapshot赋值,之后又在type == 'All'分支里重新用var声明snapshot,属于重复声明,逻辑上会覆盖前一次的查询结果,建议优化分支判断顺序,避免重复赋值
修复后代码
export default function filtercat(type,sortformat){ const locList = [] const filterbytype = async() =>{ let snapshot // 先判断是否是全分类,避免重复赋值 if (sortformat == 'rating'){ if (type == 'All'){ snapshot = await firebase.firestore().collection('Locations').orderBy('rating','desc').get() } else { snapshot = await firebase.firestore().collection('Locations').where("category", "==", type).orderBy('rating','desc').get(); } } if (sortformat == 'name'){ // 统一用asc升序匹配预期 if (type == 'All'){ snapshot = await firebase.firestore().collection('Locations').orderBy('name','asc').get() } else { // 把错误的asce改成asc snapshot = await firebase.firestore().collection('Locations').where("category", "==", type).orderBy('name','asc').get(); } } if (snapshot.empty){ console.log('No matching documents'); return; } snapshot.forEach(doc=> { locList.push(doc.data()); }) } return filterbytype().then(()=>{ console.log(locList) return locList; }) }
额外校验项
如果修改后还是有问题,检查以下两点:
- 确认Firestore中
name字段的类型是string,如果是其他类型会导致排序规则异常 - 确认配置的复合索引是
category升序 + name升序,和查询逻辑匹配
内容的提问来源于stack exchange,提问作者Chang
相关产品推荐
相关产品推荐

