Firebase查询如何通过SSN前8位筛选指定年龄区间的用户数据
解决方案
方案1:新增冗余字段(推荐)
这是性能最高、维护最简单的实现方式:
- 给用户表新增一个
SSN_BirthPrefix字段,存储SSN的前8位出生日期,格式和你转换出的sdflow/sdfhigh保持一致(数字或字符串均可) - 直接基于该字段做范围查询即可,代码如下:
// 注意年龄范围对应的出生日期顺序:如果要查20-30岁,出生日期应该早于20年前、晚于30年前,所以test2是更小的起始值,test1是更大的结束值 Query Qage=ref.orderBy("SSN_BirthPrefix").startAt(test2).endAt(test1);
这种方式的查询完全符合数据库的索引规则,不会有性能问题,后续如果有其他基于出生日期的查询需求也可以直接复用。
方案2:不修改现有数据结构,直接基于SSN字段查询
因为你的SSN是12位固定长度的数字,前8位是出生日期,后4位是0000-9999的识别码,只需要把你计算出的出生日期边界补全后4位的范围即可:
- 起始值 = 出生日期左边界 * 10000(相当于后4位补0,覆盖该出生日期对应的最小SSN)
- 结束值 = 出生日期右边界 * 10000 + 9999(相当于后4位补9,覆盖该出生日期对应的最大SSN)
调整后的查询代码如下:
int startSSN = test2 * 10000; int endSSN = test1 * 10000 + 9999; Query Qage=ref.orderBy("SSN").startAt(startSSN).endAt(endSSN);
如果你的SSN存储类型是字符串类型,把边界值转成8位字符串后拼接0000和9999即可,逻辑完全一致。
额外注意:你当前的日期计算逻辑可能存在顺序问题,建议先打印
test1和test2的数值确认大小是否符合预期:例如查询20-30岁的用户,30年前的出生日期数值更小(如1994xxxx)应该作为左边界,20年前的出生日期数值更大(如2004xxxx)应该作为右边界,如果顺序反了查询会返回空结果。
内容的提问来源于stack exchange,提问作者Oliver Gustafsson
相关产品推荐
相关产品推荐

