Firebase实时数据库中的分页功能

4

我正在使用Firebase实时数据库,并且对NoSQL相当新。以下是我的数据库结构示例。

示例数据库Json树
我想通过REST GET方法获取所有季节的内容。例如下面的代码片段。

 @GetMapping(value = "seasons", params = {"page", "size"})
    public ResponseEntity<List<SeasonDTO>> getAllSeasons(@RequestParam("page") int page, @RequestParam("size") int size) {
        ResponseEntity<List<FSeason>> fSeasons = DBHandle.retrieveDataList(FSeason.class, dbRef.child(FSeason.key).orderByKey().limitToFirst(page * size).limitToLast((page + 1) * size));
       ........
        List<SeasonDTO> map = modelMapper.map(fSeasons.getBody(), seasonDTOListType);
        return new ResponseEntity<>(map, HttpStatus.OK);
    }

我尝试实现数据库查询,如下:

FirebaseDatabase.getInstance(firebaseApp).getReference("resources").child(FSeason.key).orderByKey().limitToFirst(page * size).limitToLast((page + 1) * size)

但失败了。有人能展示一下如何正确编写查询吗?


我认为这个资源会有所帮助。这是相应的代码库 - Alex Mamo
1个回答

10
FirebaseDatabase.getInstance(firebaseApp)
    .getReference("resources")
    .child(FSeason.key)
    .orderByKey()
    .startAt(id)
    .limit(size)

startAt(...)函数将在数据库中设置游标。这些数据的顺序由orderByKey()函数定义,该函数按字母顺序对数据进行排序。此外,limit(...)函数定义每次查询要检索的数据量。

以下是关于startAt(...)的官方文档:

创建一个查询,仅返回值大于或等于给定值的子节点,使用给定的orderBy指令或priority作为默认值。

startAt(id)中的id表示上一次检索的文档的ID。因此,每次解析查询结果时,请存储最后一个元素的ID,并将其用于下一个查询。


1
不使用 orderbykey 会下载节点到客户端,然后在客户端进行分页,这样做没有好处。 - Ankit meena
如果 Firebase 数据库中的键是整数,怎么办?我发现没有办法按整数键排序。 - Farhan
“最后检索文档的ID”并不太适用,因为文档作为JSON对象而不是数组返回,所以没有“最后一个”,因为没有排序。我们真的应该自己按字母顺序排列所有键吗?我担心我的排序与Firebase的排序略有偏差可能会导致无限循环。 - HughHughTeotl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接