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

如何使用AngularFire、Firestore和Firebase分页到上一页,angular,firebase,google-cloud-firestore,angularfire,Angular,Firebase,Google Cloud Firestore,Angularfire,对不起,我看到这个问题在这里以不同的方式被问了很多次,例如: 但没有一个答案能够真正解释解决方案,也无法理解 我还阅读了许多教程,如: 详情如下: 这就是我到目前为止所做的 let query = ref.orderBy(orderBy, asc ? 'asc' : 'desc').limit(limit); if (startAfter) { // Thiis works as it should query = quer

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

但没有一个答案能够真正解释解决方案,也无法理解

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

详情如下:

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

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)
不会在该文档结束之前结束,我认为它已达到极限

所以我想我是从上面提到的github问题中得到启发的一条评论中解决了这个问题:

假设您有这个数组,并且正在按升序排序

A,
B, 
C,
D,
E,
F, 
你有两个结果的页面限制

当你在第三页的时候,你应该

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

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

  • 截至<代码>firebase@7.3.0
    您可以使用
    Query.limitToLast(n:number)
    方法-使分页数据的向后移动更加容易

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

    功能下一页(最后一页){
    返回ref.orderBy('age').startAfter(last.age).limit(3);
    }
    功能页(第一页){
    返回ref.orderBy('age').endBefore(first.age).limitToLast(3);
    }
    
    @f.khantsis嘿!末日777?从年度股东大会地图?迪米特里奥斯·卡内洛普洛斯我们已经谈过了。这真是太糟糕了,更糟糕的是firebase团队没有帮助解决这些问题。谢谢你的建议。我一直在努力做到这一点。嘿@JimmyKane,回答得不错!他们甚至不想把这当作“一个问题”:虽然我知道他们的NoSQL数据库结构不能完全处理这种方法,但他们至少应该就如何以体面的方式解决这个问题发表意见,但他们更愿意简单地接受“Firestore不是你的DB”这一事实,这很糟糕,因为在Firebase中,没有SQL替代方案(或其他NoSQL可以处理这种方法)。谢谢Jimmy,我也将您的逻辑应用到了我的vuexfire应用程序中。唯一需要注意的是,如何使用文档快照对象(而不是数组)执行步骤4反转数组。在尝试为
    firestore
    应用程序实现分页时,遇到了此解决方案,并对其进行了进一步研究。我想说,虽然这是一个可行的解决方案,但您可以很容易地超越您的使用限制。假设您在一个集合中有
    100个
    文档,每页显示
    10个
    文档,您现在是最后一页了。执行上一页意味着您将执行
    90
    reads以转到上一页。对于
    1000
    文档,这将是
    990
    读取。你明白我的意思了。因此,如果有人打算用这种方式实现分页,请小心。您认为这应该是正确的答案吗?我这样问是因为我还没有尝试过这个,我不知道这是否有任何区别和最重要的限制。不需要更改,我只是想确保这个选项显示在这里,因为它是SDK中的一个全新功能。将仅适用于7.3或更高版本的应用程序。我将等待一段时间,让用户对您的应用程序进行升级,然后我将更改此内容,以便我们可以讨论我认为helplimitToLast()中的大部分内容为我提供了窍门(用于导航到上一页)。我做出了正确的回答,因为您得到了用户的选择:-D感谢:-D