【问题标题】:Mongoose .sort breaks .skip & .limitMongoose .sort 打破 .skip & .limit
【发布时间】:2021-05-16 05:09:41
【问题描述】:

所以我用猫鼬实现了 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 个赞。那么猫鼬会随机化吗?如果有的话听起来真的很奇怪

如果有人能帮我解决这个问题,我将非常感激

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    基本上你的问题类似于分页。

    由于您的多个文档包含相同的 upvotes 值,mongo 无法识别差异(相同值之间)并且可以一遍又一遍地给出相同的文档。

    例如,您假设您的limit2,以下是您的文档。

    [{
      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()
    

    【讨论】:

      猜你喜欢
      • 2016-08-08
      • 1970-01-01
      • 2016-02-28
      • 2015-01-25
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2023-01-19
      相关资源
      最近更新 更多