如何无需计数实现Spring Data MongoDB分页查询并返回PageDto
优化MongoDB分页查询:无需总数统计实现自定义PageDto
要避免耗时的count查询实现分页,核心思路是多查一条数据来判断是否存在下一页,同时利用Pageable本身的信息判断上一页是否存在,这样只需要一次数据库查询就能完成分页逻辑。
实现步骤与代码
fun search(query: Query, pageable: Pageable): PageDto<BookDocument> { // 调整查询:在分页基础上多查1条,用于判断下一页是否存在 val adjustedQuery = query.with(pageable).limit(pageable.pageSize + 1) val fullResults = mongoTemplate.find(adjustedQuery, BookDocument::class.java) // 截取当前页的有效数据(最多pageSize条) val pageData = if (fullResults.size > pageable.pageSize) { fullResults.subList(0, pageable.pageSize) } else { fullResults } // 判断是否有下一页:结果数量超过当前页容量,说明还有更多数据 val hasNext = fullResults.size > pageable.pageSize // 判断是否有上一页:当前页码大于0即存在上一页 val hasPrevious = pageable.pageNumber > 0 return PageDto(pageable, pageData, hasNext, hasPrevious) }
关键细节说明
- 调整查询条件:通过
limit(pageable.pageSize + 1)让MongoDB返回比当前页容量多一条的数据,这条额外的数据仅用于判断下一页是否存在,不会返回给前端 - hasNext逻辑:如果查询结果的数量大于当前页的pageSize,证明下一页还有数据,反之则没有
- hasPrevious逻辑:直接利用Pageable中的
pageNumber判断,只要页码大于0,就说明存在上一页,无需额外查询数据库
这种方式的优势是只发起一次数据库请求,避免了count操作在大数据集合下的性能瓶颈,同时完美适配你自定义的PageDto结构。
内容的提问来源于stack exchange,提问作者NeverSleeps
相关产品推荐
相关产品推荐

