如何用Python在Firestore实时数据库实现日期范围过滤?查询无结果排查
Firebase实时数据库日期过滤查询返回空字典的问题排查
你遇到的查询返回空字典,大概率是这几个原因导致的,逐个排查:
未配置对应索引
Firebase实时数据库对order_by_child加过滤的查询要求必须配置索引。如果没在控制台为start_date字段创建索引,查询会直接返回空。去Firebase控制台的数据库 -> 规则页面,添加针对start_date的索引配置,比如:{ "rules": { "你的节点路径": { ".indexOn": ["start_date"] } } }日期类型/格式不匹配
检查start_date在数据库里的存储类型:如果存的是Unix时间戳(数字),但params.final_date传的是ISO字符串(比如"2024-05-20"),或者反过来,类型不匹配会导致比较逻辑失效,查不到数据。要保证参数和数据库字段的格式完全一致,比如统一用时间戳或者统一用ISO格式字符串。查询路径错误
确认path参数指向的是告警数据所在的正确节点。如果路径写错了,比如少了层级或者节点名称拼写错误,自然查不到任何数据。参数日期范围不合理
检查params.final_date的取值,如果所有告警的start_date都大于这个值,查询结果自然为空。可以先打印params.final_date的值,再对比数据库里的start_date数据,确认范围是否合理。
另外,按照你的计划,加上后端过滤final_date >= start_filter的完整代码应该是这样:
def get_dates(self, path, params: FilterDates): # 先通过查询获取start_date <= final_date的结果 query_result = ( self.db.reference(path) .order_by_child("start_date") .end_at(params.final_date) .get() ) # 后端过滤final_date >= start_filter的条目 filtered_alerts = {} if query_result: for alert_id, alert_data in query_result.items(): if alert_data.get("final_date") >= params.start_date: filtered_alerts[alert_id] = alert_data return filtered_alerts
内容的提问来源于stack exchange,提问作者Diego L
相关产品推荐
相关产品推荐

