Paginating按时间顺序排列Firebase儿童优先顺序

Sim*_*ken 5 firebase

tl; dr在Firebase中执行基本分页startAt,endAt并且limit非常复杂,必须有一个更简单的方法.

我正在为大量用户提交构建一个管理界面.我的初始(和当前)想法是简单地获取所有内容并在客户端上执行分页.然而,当获取2000个以上的记录(每个包含5-6个小数字/字符串字段)时,存在明显的延迟,我将其归因于超过1.5mb的数据有效载荷.

目前所有的条目都是通过push但是我对于如何通过巨大的列表进行分页而丢失了.

要取我使用的数据的第一页endAt有一个limit5:

ref.endAt().limit(10).on('child_added', function(snapshot) {
    console.log(snapshot.name(), snapshot.val().name)
})
Run Code Online (Sandbox Code Playgroud)

这导致以下结果:

-IlNo79stfiYZ61fFkx3 #46 John
-IlNo7AmMk0iXp98oKh5 #47 Robert
-IlNo7BeDXbEe7rB6IQ3 #48 Andrew
-IlNo7CX-WzM0caCS0Xp #49 Frank
-IlNo7DNA0SzEe8Sua16 #50 Jimmmy
Run Code Online (Sandbox Code Playgroud)

首先要弄清楚有多少页面我保留了一个单独的计数器,只要有人添加或删除记录就会更新.

其次,因为我正在使用push我无法导航到特定页面,因为我不知道特定页面的最后一条记录的名称,这意味着目前这样的界面是不可能的:

标准分页控件

为了简单起见,我决定简单地使用下一个/上一个按钮,这也会带来一个新问题; 如果我使用上一个结果集中第一个记录的名称,我可以使用以下内容分页到下一页:

ref.endAt(null, '-IlNo79stfiYZ61fFkx3').limit(5).on('child_added', function(snapshot) {
    console.log(snapshot.name(), snapshot.val().name)
})
Run Code Online (Sandbox Code Playgroud)

此操作的结果如下:

-IlNo76KDsN53rB1xb-K #42 William
-IlNo77CtgQvjuonF2nH #43 Christian
-IlNo7857XWfMipCa8bv #44 Jim
-IlNo78z11Bkj-XJjbg_ #45 Richard
-IlNo79stfiYZ61fFkx3 #46 John
Run Code Online (Sandbox Code Playgroud)

现在我有下一页,除了它移动了一个位置意味着我必须调整我的限制并忽略最后一个记录.

要向后移动一页,我必须在客户端保留一份单独的列表,列出我目前收到的每条记录,并找出要传递给的名称startAt.

有没有更简单的方法来做到这一点,还是我应该回去取一切?

And*_*Lee 7

我们正在努力添加"offset()"查询以便于分页.我们还将添加一个特殊端点,以允许您读取某个位置的子节点数,而无需从服务器实际加载它们.

这两个都需要一点点.与此同时,您描述的方法(或在客户端上完成所有操作)可能是您最好的选择.

如果您的数据结构仅附加,则在编写数据时也可能会进行分页.例如:将第一个50放入/ page1,将第二个50放入/ page2等.

  • 谢谢,offset()和count()将解决所有分页问题. (2认同)