我正在尝试向Express + Firebase实时数据库SDK添加一些分页功能,但不确定如何实现,documentation并没有帮助我。另外,我发现的所有示例都与Firestore有关。
仅作为示例,我有此模型 User ,可以通过database.ref('users')
访问。想象一下,我有10个用户的ID分别从1到10,并且我希望每页分5个页面。
我期望的是获得密钥从1到5的用户,然后当有人单击页面2时,它将获得密钥从6到10的用户。
根据文档,我了解到我应该添加如下内容:
(req, res) => {
const { key } = req.query;
let ref = database.ref('users')
.orderByChild('createdAt')
.limitToLast(5);
if (key) {
ref = ref.startAt(key);
}
ref.once('value')
.then(snapshot => ...);
}
到目前为止,我得到的是limitToLast()
和limitToFirst()
之间的区别在于排序,分别类似于ORDER BY createdAt DESC
和ORDER BY createdAt ASC
。
如果我设置了ref.startAt(5)
,则由于我要获得前五个用户(1到5),因此先前的代码不起作用。
我应该使用哪种方法?预先感谢。
我知道如果我database.ref('users').orderByChild('createdAt').limitToLast(5).startAt(5)
会得到createdAt
大于5的文档,这是错误的。那些键在5旁边的文档之后,我应该按日期排序。
答案 0 :(得分:1)
我在一个非常相似的场景中挣扎,尽管相反 - 我想显示最后 10 条记录,然后分页到列表的开头(在我的例子中,列表是按日期排序的,我想显示最晚日期优先);
但是,对于您的示例,我可以通过实现以下内容从 1-5 到 6-10 进行分页:
前 5 个用户:
database
.ref('users')
.orderByChild('createdAt')
.limitToFirst(6) //Note here that the request is for the first 6 results
.once("value")
.then((snap) => {
const firstSix = snap.val();
const sixth = firstSix[5].createdAt; //assuming your data is an array, get the last entry
const startAtNext = sixth, //this is the 6th value used for pulling the next 5 results - this should be stored globally
const currentUserList = firstSix.slice(0, firstSix.length -1), //the list of users 1-5
});
对于接下来的 5 个用户:
database
.ref('users')
.orderByChild('createdAt')
.startAt(startAtNext) // Globally stored variable from first call
.limitToFirst(6) //Note here that the request is for the first 6 results
.once("value")
.then((snap) => {
const nextSix = snap.val();
const sixth = nextSix[5].createdAt; //assuming your data is an array, get the last entry
const startAtNext = sixth, // the start index for the next request
const currentUserList = firstSix.slice(0, firstJobsList.length -1), //the next 5 users
});