如何使用 AngularFire、Firestore 和 Firebase 分页到上一页

Posted

技术标签:

【中文标题】如何使用 AngularFire、Firestore 和 Firebase 分页到上一页【英文标题】:How to paginate to previous page using AngularFire, Firestore and Firebase 【发布时间】:2019-06-02 02:28:16 【问题描述】:

对不起,我看到这个问题在这里以不同的方式被问过很多次,例如:

Howto paginate back to previous pages in a Angular(6) and firebase Firestore setup How to paginate Firestore dataset by individual page?

但没有一个答案能真正解释解决方案或可以理解。

我还阅读了许多教程,例如:

https://howtofirebase.com/firebase-data-structures-pagination-96c16ffdb5ca https://rexrainbow.github.io/phaser3-rex-notes/docs/site/firebase-firestore/#paginate

至详情:

这就是我到目前为止所做的事情

let query = ref.orderBy(orderBy, asc ? 'asc' : 'desc').limit(limit);
        if (startAfter) 
          // Thiis works as it should
          query = query.startAfter(startAfter);
        
        if (endBefore) 
          // This here does not work or give the correct results. I get the first page. 
          query = query.endBefore(endBefore);
        
        return query;

所以:

query = query.startAfter(startAfter); 按预期工作。

但是:

query = query.endBefore(endBefore) 不会在该文档之前结束,我认为它会达到极限。

【问题讨论】:

【参考方案1】:

firebase@7.3.0 开始,您可以使用Query.limitToLast(n: number) 方法 - 使用分页数据更容易向后移动。

您的实现细节可能如下所示:

function nextPage(last) 
   return ref.orderBy('age').startAfter(last.age).limit(3);


function prevPage(first) 
   return ref.orderBy('age').endBefore(first.age).limitToLast(3);

【讨论】:

你认为这应该是正确的答案吗?我问是因为我还没有尝试过这个,我不知道这是否有任何差异和最重要的限制。 无需更改,我只是想确保该选项显示在此处,因为它是 SDK 中的全新功能。仅适用于 7.3 或更高版本的应用。 我会等一段时间,让用户抚养你,然后我会改变这个,所以我们可以覆盖我认为很大一部分帮助 limitToLast() 为我做了诀窍(导航到上一页)。 我做了这个正确的答案,因为你得到了人们的选择:-D 谢谢你:-D【参考方案2】:

所以我想我是通过上面提到的 github 问题启发的评论解决了这个问题:

假设你有这个数组并且你正在升序排序

A,
B, 
C,
D,
E,
F, 

您的页面限制为 2 个结果

那么当你在第三页时你应该有

E,
F

现在您需要转到上一页,您需要做的是:

    颠倒排序,我们的数据应该是[F,E,D,C,B,A] startAfter 当前查看页面的第一个文档(在我们的例子中是 E) 查询 Firestore 以获取结果(例如,您的限制为 2)。您应该以相反的顺序获得并在E 之后开始,即[D,C] 反转上面的数组,这样它就是[C,D] 完成

【讨论】:

@f.khantsis 嘿!末日777?来自 AGM 地图? Dimitrios kanellopoulos 我们在这里谈过。这很浪费时间,更糟糕的是,firebase 团队不帮助处理这些查询。 感谢您的想法。我正在努力实现这一目标。 嘿@JimmyKane,很好的答案!他们甚至不想将其视为“问题”:github.com/firebase/firebase-js-sdk/issues/479 虽然我知道他们的 NoSQL 数据库结构不能完全处理这种方法,但他们至少应该就如何以体面的方式解决这个问题发表意见,但他们更愿意简单地接受“Firestore 不是您的数据库”这一事实,这很糟糕,因为在 Firebase 中,没有 SQL 替代方案(或其他可以处理这种方法的 NoSQL)。 感谢 Jimmy,我也将您的逻辑应用到了我的 vuexfire 应用程序中。唯一需要注意的是如何使用文档快照对象(不是数组)完成第 4 步反转数组 试图为 firestore 应用程序实现分页,并遇到了这个解决方案并对其进行了进一步研究。我想说,虽然这是一个可行的解决方案,但您可以非常轻松地超出您的使用限制。假设您在集合中有100 文档,每页显示10 文档,您现在位于最后一页。执行上一页意味着您将执行 90 读取只是为了转到上一页。使用1000 文档,将读取990。你明白我的意思。所以请注意是否有人要以这种方式实现分页。

以上是关于如何使用 AngularFire、Firestore 和 Firebase 分页到上一页的主要内容,如果未能解决你的问题,请参考以下文章

如何使用angularfire2检查孩子是不是存在于firebase列表中

如何使用 AngularFire2 和 Firebase 存储上传文件数组?

如何在单元测试中模拟 AngularFire 2 服务?

如何使用 angularfire2 valuechanges 方法获取随机数据

如何使用 AngularFire、Firestore 和 Firebase 分页到上一页

AngularFire2:实时数据库:如何获取键和值