当前位置: 首页 > 知识库问答 >
问题:

我怎么能分页降序由子值与Firebase?

阎卓
2023-03-14

假设我有一些数据如下:

{
    "name": "post #1",
    "votes": 100
},
{
    "name": "post #2",
    "votes": 10000
},
{
    "name": "post #3",
    "votes": 750
}

等等

firebase中的数据显然不是按投票排序的,而是按键排序的。

我希望能够按投票数降序排列这些数据。

我想我必须这样做:

ref.orderByChild('votes')
    .startAt(someValue)
    .limitToFirst(someOtherValue)
    .once('value', function(snapshot) {
        resolve(snapshot);
    });

或者,我需要使用limitToLast和endAt?

通过key分页很容易,但这个难倒了我。

更新(2017年10月16日):Firebase最近宣布Firestore-其完全管理的NoSQL数据存储,这将使执行更复杂的查询更容易。可能仍有一些用例可以使用他们一直提供的实时数据库。如果你是这些人中的一员,这个问题应该仍然适用。

共有1个答案

宓诚
2023-03-14

经过一整天的编码后,我发布了这个问题,我的大脑一团糟。

今天早上,我又试了一次,像往常一样,很快就找到了解决方案。

解决方案:

为了分页数据,我们需要能够从列表中间任意提取排序数据。您可以使用fire base API提供的以下函数来做到这一点:

开始时间

结束

限制第一

limitToLast

更多信息可以在这里找到。

在我的例子中,因为我需要按降序排列数据,所以我将使用endAt和limitToLast。

假设我希望我的每个页面都有五个项目。我会这样写我的第一个查询:

ref.orderByChild('votes')
    .limitToLast(5)
    .once('value', function(snapshot) {
      console.log('Snap: ', snapshot.val());
    });

这会得到得票最高的5个项目。

为了获得下一页,我们需要存储上一次查询结果中的两条数据。我们需要存储投票数,并为投票数最少的项目设置键。也就是说,我们名单上的最后一项。

使用该数据,我们的下一个查询和所有后续查询如下所示:

ref.orderByChild('votes')
    .endAt(previousVoteCount, previousKey)
    .limitToLast(5)
    .once('value', function(snapshot) {
      console.log('Snap: ', snapshot.val());
    });

您会注意到,在这个查询中,我添加了endAt。这将从上一个列表中的最后一个项目开始,获得接下来的5个投票最多的项目。我们必须包含前一个列表中最后一个项目的键,这样,如果有多个项目具有相同的投票数,它将返回一个以正确项目开头的列表,而不是它找到的具有该投票数的第一个项目,该列表可能位于您从初始查询中获得的列表的中间位置。

就是这样!

 类似资料:
  • 我想扫描代码库,以识别当前无法访问的未定义子例程的所有实例。 例如: > 我不想依赖运行时发出的警告来识别未定义的子程序 和pragmas在这里没有帮助<代码>使用严格的“subs”无效。 甚至下面的代码片段也是无声的

  • 在代理切换到分页模式后,我看到性能出现了奇怪的下降。一些消息开始花很长时间: 1800 我还看到了大量磁盘使用情况: 我的: Linux Astra、4 CPU 24GB ram 50GB SSD、ActiveMQ Artemis 2.7.0 只有代理重启有帮助

  • 假设我正在为评论系统使用Firebase,我想检索给定主题的评论,但是一个主题中有太多评论,我不想一次检索所有评论。我还希望最新的评论显示在顶部。 似乎以相反顺序显示firebase记录的唯一方法是检索所有记录,然后反向迭代它们。 这在大型数据集上可能会变得非常笨拙,尤其是对于移动客户端。 有更好的方法吗?从Firebase按升序或降序查询分页数据的通用和首选解决方案是什么?

  • 我是打字稿的新手。我需要得到的子状态值的父使用ref上的按钮点击更新的减速器值。 我已尝试将传递给孩子,但我得到的错误与此类似: 类型{value:string;onChange:Dispatch 属性“ref”不存在于类型“IntrinsicatAttributes”上 父组件 子组件

  • 有时,客户端希望 RESTful Web API 提供经过排序后的字段,比如,按照年龄从大到小排列学生;有时,根据客户端条件,需要返回给前端的数据过多,如果一次提供,会大大降低响应速度。此时,可将数据做分割,分成不同的小份,发送给客户端。这一节,我们为大家介绍 RESTful Web API 如何实现数据的排序与分页。 1.排序的使用 在类视图中设置 filter_backends,使用rest_

  • 我用了Lombok,开放伪装和Spring Web 我有currencyClient接口: 和控制器: 和"http://localhost:1212/getAllCurrency"是不工作的原因链接转换成"**https://openexchangerates.org/api/historical/2012-07-10.json/appId**"我明白