Firebase使用orderByChild按日期排序结果异常该如何解决?
问题根因
你存储的日期为MM/DD/YYYY格式的字符串,数据库对字符串的排序规则是逐位比较字符的ASCII码值,10/1/2021首字符为1,2/1/2021首字符为2,因此会出现前者排在前面的错误排序结果,和实际日期先后逻辑不符。
修复方案
方案1:调整日期存储格式(最推荐)
从底层解决排序问题,数据库原生即可支持正确排序,无需额外逻辑,推荐两种存储格式:
- 存储为Unix时间戳数字:写入数据时将日期转换为10位秒级或13位毫秒级时间戳,数字类型天然按大小排序,原有查询代码无需修改,直接使用
ref.limitToFirst(10).orderByChild('date')即可得到正确排序结果。 - 存储为ISO 8601格式字符串:将日期存为
YYYY-MM-DD格式(如2021-02-01、2021-10-01),该格式字符串逐位比较时优先对比年份、再对比月份、最后对比日期,排序逻辑和日期先后完全一致,原有查询代码同样无需修改。
方案2:前端二次排序(适配存量数据无法修改的场景)
如果已有大量存量数据无法调整存储格式,可以先拉取查询结果,在前端手动做日期排序:
// 查询原始数据 const snapshot = await ref.limitToFirst(10).orderByChild('date').get() const dataList = [] snapshot.forEach(childSnapshot => { dataList.push({ ...childSnapshot.val(), key: childSnapshot.key }) }) // 手动按日期排序 dataList.sort((prev, curr) => { const prevDate = new Date(prev.date) const currDate = new Date(curr.date) return prevDate.getTime() - currDate.getTime() }) // 此时dataList即为按日期正确排序的结果
注意:原代码中的
LimitToFirst首字母需要小写为limitToFirst,符合Firebase等数据库SDK的驼峰命名规则,否则会出现方法未定义的报错。
内容的提问来源于stack exchange,提问作者Nova Nova
相关产品推荐
相关产品推荐

