Firebase Database分页查询:按用户筛选并基于PushKey分页取数
Firebase Realtime Database 按用户分页查询实现
现有数据结构
post:{ pushKey1:{ text:1, user:"user1" }, pushKey2:{ text:2, user:"user1" }, pushKey3:{ text:3, user:"user2" }, pushKey4:{ text:4, user:"user1" }, pushKey5:{ text:5, user:"user3" }, pushKey6:{ text:6, user:"user1" }, pushKey7:{ text:7, user:"user1" } }
需求
筛选出所有user字段等于user1的数据,每次返回2条,用上一次查询得到的pushKey,配合startAt/endAt实现分页,自动排除user不为user1的节点(如pushKey3、pushKey5)。
分页查询实操
第一次查询(获取最新2条)
Firebase的pushKey按时间生成,越新的pushKey字典序越大,要拿到最新的pushKey7、pushKey6,直接按user过滤后取最后2条:
ref().child("post").orderByChild("user").equalTo("user1").limitToLast(2).get();
查询结果:pushKey7、pushKey6
记录本次返回的最小pushKey(pushKey6),作为下一次查询的边界值。
第二次查询(获取pushKey4、pushKey2)
以上次记录的pushKey6为边界,用endAt限定查询范围(只查pushKey小于pushKey6的节点),再取最后2条:
ref().child("post").orderByChild("user").equalTo("user1").endAt(null, "pushKey6").limitToLast(2).get();
这里endAt的第二个参数指定pushKey,确保只匹配user为user1且pushKey小于pushKey6的节点,查询结果:pushKey4、pushKey2
记录本次返回的最小pushKey(pushKey2)。
第三次查询(获取pushKey1)
继续用pushKey2作为边界执行查询:
ref().child("post").orderByChild("user").equalTo("user1").endAt(null, "pushKey2").limitToLast(2).get();
此时符合条件的只剩pushKey1,查询结果:pushKey1
关键注意点
- 按
user排序后,同一用户的节点会按pushKey升序排列(pushKey越小,生成时间越早)。 - 必须利用
endAt(value, key)的第二个参数精准限定pushKey边界,避免重复获取数据。 - 每次查询后务必记录返回结果中的最小pushKey,作为下一次分页的起始边界。
内容的提问来源于stack exchange,提问作者Amit Yadav
相关产品推荐
相关产品推荐

