mongodb - Mongoose .sort 打破 .skip 和 .limit

标签 mongodb mongoose

所以我用 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"
}]

现在,如果您将 sortupvotes: -1limit 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/

相关文章:

MongoDB:批量插入(Bulk.insert)与插入多个(插入([...]))

mongodb 等待连接

使用 Mongoose 到 MongoDB 的 Node.js SSH 隧道

node.js - 尝试从 mongodb 格式化 DATE 时出现问题

javascript - Mongoose 模型对象行为异常

node.js - Node 上mongodb的纯javascript客户端?

javascript - deleteMany 显示 0 已删除但实际上删除了文档

javascript - Mongodb 返回旧集合

typescript - Mongoose 预存给我红线?

node.js - 如何在 mongoose 中使用查询修饰符?