我使用的是Firebase实时数据库,对NoSQL来说还很陌生。这里是我的数据库结构示例。
我想通过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)
但是失败了。有人可以告诉我如何正确编写查询。
答案 0 :(得分:1)
FirebaseDatabase.getInstance(firebaseApp)
.getReference("resources")
.child(FSeason.key)
.orderByKey()
.startAt(id)
.limit(size)
在这里,startAt(...)
将在数据库中设置光标。这些数据的顺序由您的orderByKey()
函数定义,该函数按字母顺序对数据进行排序。此外,limit(...)
函数定义每个查询要检索多少数据。
这是 startAt(...)上的官方文档:
创建一个约束,以仅返回具有值的子节点的查询 使用给定的orderBy大于或等于给定的值 指令或默认优先级。
id
中的startAt(id)
代表最后检索到的文档的ID。因此,每次您解析查询结果时,都要存储最后一个元素的ID,并将其用于下一个查询。