Firebase实时数据库分页

时间:2020-03-26 15:30:27

标签: javascript node.js firebase express firebase-realtime-database

我正在尝试向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 DESCORDER BY createdAt ASC

如果我设置了ref.startAt(5),则由于我要获得前五个用户(1到5),因此先前的代码不起作用。

我应该使用哪种方法?预先感谢。

编辑:

我知道如果我database.ref('users').orderByChild('createdAt').limitToLast(5).startAt(5)会得到createdAt大于5的文档,这是错误的。那些键在5旁边的文档之后,我应该按日期排序。

1 个答案:

答案 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
});