为什么Firebase文档排序时100排在11前面?有什么解决方法?
问题原因与解决方案
根因说明
你遇到的排序异常核心原因是 Firebase 的文档ID(docID)本身强制为字符串类型,即使你传入的是数字,也会被自动转换为字符串存储,排序时默认采用字典序而非数字大小排序:
字典序会逐位比对字符的ASCII码值,比对"100"和"11"时:
- 第一位都是
'1',相等 - 第二位
"100"是'0',"11"是'1','0'的ASCII码值小于'1',所以最终"100"会排在"11"前面。
你之前修改字段为int、double类型无效,是因为你排序时依赖的是文档ID而非你修改类型的自定义字段,文档ID的字符串属性不受你自定义字段类型的影响。
异常排序效果参考:
可落地解决方案
- 方案1:使用自定义数字字段排序
在用户文档中新增一个单独的数字类型字段,比如user_numeric_id,存储你对应的数字ID,查询时使用orderBy("user_numeric_id")进行排序,Firebase会按照数字大小排序,彻底规避字典序问题,是最推荐的方案。 - 方案2:文档ID补前导零固定长度
如果你必须依赖文档ID进行排序,可以将所有ID补前导零到统一长度,比如预估最高用户量到千万级就统一为8位:11转为"00000011"、100"转为"00000100",此时字典序排序结果和数字大小排序结果完全一致。注意设置的长度要留足冗余,避免后续用户量超出长度后再次出现排序异常。 - 方案3:前端二次排序
如果你的数据量较小,可以拉取全量数据后在前端将ID转换为数字再排序,JavaScript端示例代码如下:const sortedUserList = userList.sort((prev, next) => Number(prev.id) - Number(next.id))
内容的提问来源于stack exchange,提问作者Mateus Neves
相关产品推荐
相关产品推荐

