所以我用 mongoose 实现了 infiniscroll,我的查询如下所示
const posts = await Seed.find({status: 'APPROVED', 'color.name': color})
.skip(parseInt(skip) || 0)
.limit(8)
.exec()
效果很好,从 0 到帖子末尾。但是,如果我添加 .sort({upvotes: -1})
const posts = await Seed.find({status: 'APPROVED', 'color.name': color})
.sort({upvotes: -1})
.skip(parseInt(skip) || 0)
.limit(8)
.exec()
一切都变得疯狂,我可以得到同样的帖子 6 次。
我已经盯着这个问题看了好几个小时了,我根本不明白为什么会发生这种情况,感觉就像一个错误。
我尝试过 .sort('-upvotes')、.sort({upvotes: 'desc'})、.sort({'upvotes': 'desc'})
更新:按 .sort('-date') 排序实际上有效,所以我在赞成票方面遇到了问题。大多数帖子都有 1 票赞成。那么 Mongoose 会随机化吗?如果确实如此,听起来真的很奇怪
如果有人能帮我解决这个问题,我将非常感激
最佳答案
基本上你的问题类似于分页。
因为您的多个文档包含相同的upvotes
值,mongo无法识别(相同值之间的)差异,并且可以一遍又一遍地给出相同的文档。
例如,您假设您的限制
是2
,以下是您的文档。
[{
upvotes: 1,
doc: "a"
}, {
upvotes: 2,
doc: "b"
}, {
upvotes: 2,
doc: "c"
}, {
upvotes: 3,
doc: "d"
}]
现在,如果您将 sort
与 upvotes: -1
和 limit
2
您可能会进入第一页
[{
upvotes: 3,
doc: "d"
}, {
upvotes: 2, // here mongo fails to make difference
doc: "c" // document c
}]
或者可以给
[{
upvotes: 3,
doc: "d"
}, {
upvotes: 2, // here mongo fails to make difference
doc: "b" // document b
}]
表示 mongo 随机抛出具有相同 sort
字段值的文档。
解决方案太简单了,只需相应地输入 _id
const posts = await Seed.find({ status: 'APPROVED', 'color.name': color})
.sort({upvotes: -1, _id: -1 })
.skip(parseInt(skip) || 0)
.limit(8)
.exec()
关于mongodb - Mongoose .sort 打破 .skip 和 .limit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66172034/