Python Firebase Admin end_at()双参数传递及Realtime Database排序问题
Python firebase-admin 中使用 end_at() 传递两个参数的方法
我猜你之前直接给 end_at() 传了两个位置参数(比如 end_at(timestamp, key)),所以才会报错说只能接受一个参数——这是因为Python SDK里的 end_at() 方法,第二个参数(key)需要用关键字参数来传递,而不是位置参数。
具体来说,如果你要基于 timestamp 字段排序,同时结合Firebase自动生成的push key来做查询边界,正确的写法是这样的:
from firebase_admin import db # 假设你的数据节点在 "/posts" 路径下,每个节点有 timestamp 字段 ref = db.reference("/posts") # 按 timestamp 升序排序,然后用 end_at 指定 timestamp 值和对应的 key query = ref.order_by_child("timestamp").end_at(value=1620000000, key="-Nabc123xyz").limit_to_last(10) # 因为默认是升序,如果你要降序展示结果,把查询到的字典反转即可 results = dict(reversed(query.get().items()))
这里的关键点:
end_at()必须通过value=和key=这两个关键字参数来传递两个值,不能直接传位置参数- 如果需要降序的结果,因为Firebase Realtime Database查询默认是升序,所以可以先取
limit_to_last(n)拿到最后n条(也就是升序里的末尾,对应降序的开头),再反转字典的顺序
Android Firebase Realtime Database 中使用 startAt/endAt 传递两个参数的方法
Android的SDK就直接多了,startAt() 和 endAt() 本身就支持直接传递两个参数:第一个是排序字段的值,第二个是节点的key(用来处理多个节点有相同排序值的场景,避免重复或漏数据)。
比如你要按 timestamp 降序分页查询,假设上一页最后一条数据的timestamp是1620000000,key是"-Nabc123xyz",写法如下:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("posts"); // 按 timestamp 升序排序,取最后10条(对应降序的前10条),然后反转结果 ref.orderByChild("timestamp") .endAt(1620000000, "-Nabc123xyz") .limitToLast(10) .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { // 把结果反转成降序 List<Post> posts = new ArrayList<>(); for (DataSnapshot ds : snapshot.getChildren()) { posts.add(0, ds.getValue(Post.class)); } // 处理你的列表数据 } @Override public void onCancelled(@NonNull DatabaseError error) { // 处理错误 } });
如果是升序分页,就用 startAt() 配合 limitToFirst():
ref.orderByChild("timestamp") .startAt(1610000000, "-Ndef456uvw") .limitToFirst(10) .addListenerForSingleValueEvent(...);
这里的逻辑是:当多个节点有相同的timestamp值时,第二个参数(key)会作为额外的排序依据,确保查询的边界精准,不会出现重复或遗漏数据的情况。
内容的提问来源于stack exchange,提问作者RAHIL MODI
相关产品推荐
相关产品推荐

