Firebase Realtime DB equalTo过滤时分页报错,求解决及版本排查
Firebase Realtime DB 结合 equalTo 过滤与分页的问题
我想通过equalTo按指定子节点过滤Firebase Realtime DB的查询结果,同时实现分页功能,参考相关方案后出现如下错误:
startAfter: Starting point was already set (by another call to startAt, startAfter, or equalTo).
查看源码发现equalTo本质上会同时设置startAt和endAt,我后续调用startAfter就触发了报错。请问这和我使用的Firebase Admin SDK v9.4.2版本有关吗?
我的代码如下:
query = query.orderByChild("category").equalTo(filter); if (lastKey) { query = query.startAfter("", lastKey); }
问题原因与解决方案
这个报错和SDK版本无关,是Firebase Realtime DB的查询规则限制:equalTo()本身已经定义了查询的起止范围(等同于同时调用startAt(value)和endAt(value)),不能再叠加startAt/startAfter/endAt/endBefore这类设置范围的方法。
要实现带过滤的分页,需要换一种思路:放弃使用equalTo,直接用startAt和endAt限定过滤值,同时结合节点key实现分页。具体代码示例如下:
// 初始查询(无分页标记) query = query.orderByChild("category").startAt(filter).endAt(filter + "\uf8ff"); // 分页查询(传入上一页最后一条数据的key) if (lastKey) { query = query.orderByChild("category").startAt(filter, lastKey).endAt(filter + "\uf8ff"); }
说明:
filter + "\uf8ff"利用Unicode字符特性,\uf8ff是接近Unicode末尾的字符,字典序下能匹配所有以filter开头的值,从而精准筛选出category等于filter的条目。- 当存在
lastKey时,startAt(filter, lastKey)表示从category等于filter且key大于lastKey的位置开始查询,以此实现分页逻辑。
内容的提问来源于stack exchange,提问作者technophyle
相关产品推荐
相关产品推荐

