gpt4 book ai didi

javascript - 如何使用 firebase 按子值降序分页?

转载 作者:可可西里 更新时间:2023-11-01 01:57:21 26 4
gpt4 key购买 nike

假设我有如下一些数据:

{
"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);
});

或者,我可能需要使用 limitToLastendAt

通过 key 分页非常简单,但是这个让我很困惑。

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

最佳答案

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

今天早上我又尝试了一次,并且像往常一样,能够相当快地找到解决方案。

解决方案:

为了对数据进行分页,我们需要能够从列表中间任意提取排序数据。您可以使用 firebase API 提供的以下函数来执行此操作:

开始于

endAt

limitToFirst

limitToLast

可以找到更多信息here .

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

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

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 个投票最多的项目。我们必须包含上一个列表中最后一项的键,这样如果有多个项目具有相同的票数,它将返回一个以正确项目开头的列表,而不是它找到的第一个具有该编号的项目投票数,可能位于您从初始查询中获得的列表中间的某个位置。

就是这样!

关于javascript - 如何使用 firebase 按子值降序分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38005039/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com