- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设我有如下一些数据:
{
"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 数据存储应该可以更轻松地执行更复杂的查询。可能仍然有一些用例可以使用他们一直提供的实时数据库。如果您是这些人中的一员,这个问题应该仍然适用。
最佳答案
经过一整天的编码后,我发布了这个问题,我的大脑一片困惑。
今天早上我又尝试了一次,并且像往常一样,能够相当快地找到解决方案。
解决方案:
为了对数据进行分页,我们需要能够从列表中间任意提取排序数据。您可以使用 firebase API 提供的以下函数来执行此操作:
开始于
endAt
limitToFirst
limitToLast
可以找到更多信息here .
在我的例子中,因为我需要按降序排列我的数据,所以我将使用 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 个投票最多的项目。我们必须包含上一个列表中最后一项的键,这样如果有多个项目具有相同的票数,它将返回一个以正确项目开头的列表,而不是它找到的第一个具有该编号的项目投票数,可能位于您从初始查询中获得的列表中间的某个位置。
就是这样!
关于javascript - 如何使用 firebase 按子值降序分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38005039/
我是一名优秀的程序员,十分优秀!