我通过一次仅返回两个文档来实现分页。分页时,我需要知道是否还有更多文档需要获取,或者用户是否在最后一个
page
这是摘自此答案
的现有代码let pageCount = 2
let page = req.params.page
let result = await Chat.find()
.skip(page * pageCount)
.limit(pageCount + 1)
if (result.length === pageCount + 1) console.log("Has next page")
else console.log("On last page")
res.send(result)
此方法按预期工作,因为它正确记录是否有下一页。我遇到的问题是,当我增加页面时,例如从第 1 页到第 2 页,我会返回重复的文档。上一页也存在的文档。
我尝试将
skip
的代码更改为 skip(page * pageCount + 1)
,但这对解决问题没有任何影响。
有什么想法为什么会发生这种行为,以及任何潜在的修复方法吗?谢谢你。
假设您有
pageCount = 2
和 10 个文档。在 page = 1
上,您将跳过 page * pageCount = 2
文档 _id = 1 and 2
,然后获取下一个 pageCount + 1 = 3
,比方说 _id = 3, 4, 5
。 (要获取实际首页上的文档,您需要执行skip = (page - 1) * pageCount
。)
对于
page = 2
,您将跳过 4 个文档 1, 2, 3, 4
并获取接下来的 3 个文档,因此 5, 6, 7
。
所以 5 会重复。
在第 3 页,它会跳过 6 个文档
1 to 6
并返回 7, 8, 9
,因此 doc 7 将重复。
limit + 1
的目的只是为了识别是否有更多文档。也许它应该包括您应该跳过最后返回的文档如果您得到了那么多文档即。文档总数 == 页数。
所以在某个页面上,如果你得到3个文档,跳过结果中的第3个文档最终返回。它只是表明您有更多页面/文档。如果您只获得 2 个文档,那么不要跳过第 3 个文档(它不存在),返回 2 个文档,这就是最后一页。