Firestore使用RFC3339格式文档ID通过<运算符查询无结果怎么办
Firestore 文档ID范围查询问题与FIFO队列方案
查询返回空的问题解答
Firestore 生产环境与官方模拟器均支持对__name__(文档ID)使用</>范围查询运算符,不属于产品功能限制。你遇到的返回空结果有两种可能:
- 测试用的子集合下不存在ID早于
2020-04-23T02:00:00Z的文档,比如你示例给出的文档ID均为2021年,自然无法匹配小于2020年阈值的查询条件 - Go Firestore SDK 子集合的文档ID范围查询要求右侧参数为完整文档引用,不能直接传字符串ID,正确写法如下:
// 先构造阈值时间对应的文档引用 thresholdDoc := u.DB.Collection("users").Doc(uid).Collection("orders").Doc("2020-04-23T02:00:00Z") iter := u.DB.Collection("users").Doc(uid).Collection("orders"). Where(firestore.DocumentID, "<", thresholdDoc).Documents(ctx)
文档ID默认自带索引,无需额外创建索引即可正常执行上述查询。
带容量上限的FIFO队列实现方案
你采用单调递增RFC3339格式时间作为文档ID的设计非常适配FIFO场景,可按以下两种需求实现容量控制:
按时间周期清理(保留30天数据)
- 每次写入新文档后异步触发清理逻辑,或设置定时任务每日执行一次清理
- 构造当前时间减30天对应的RFC3339格式字符串作为阈值,按上述正确写法查询所有小于阈值的文档,单次批量删除不超过500条,分页循环处理即可
按固定条数清理(最多保留N条)
- 每次写入新文档后,按文档ID升序查询,设置
Limit(1).Offset(N),如果返回结果存在,说明当前总数超过N,查询所有ID小于该返回文档ID的文档批量删除即可 - 高频写入场景可将清理逻辑放到后台异步任务执行,无需阻塞主写入流程
内容的提问来源于stack exchange,提问作者ahmet alp balkan
相关产品推荐
相关产品推荐

