具有两个值的MongoDB分页

具有两个值的MongoDB分页,mongodb,mongoose,pagination,Mongodb,Mongoose,Pagination,假设我的MongoDB记录如下所示: {类别:A,子类别:1} {类别:A,子类别:2} {类别:A,子类别:3} {类别:B,子类别:1} {类别:B,子类别:2} {类别:B,子类别:3} {类别:C,子类别:1} {类别:C,子类别:2} {类别:C,子类别:3} 我试图用这些值实现分页。因此,我用这两个字段创建了一个复合索引(都是升序) 假设我的页面限制是2 所以我的第一个查询看起来像->db.record.find().sort({category:1,sub_category:1})

假设我的MongoDB记录如下所示:

  • {类别:A,子类别:1}
  • {类别:A,子类别:2}
  • {类别:A,子类别:3}
  • {类别:B,子类别:1}
  • {类别:B,子类别:2}
  • {类别:B,子类别:3}
  • {类别:C,子类别:1}
  • {类别:C,子类别:2}
  • {类别:C,子类别:3}
  • 我试图用这些值实现分页。因此,我用这两个字段创建了一个复合索引(都是升序)

    假设我的页面限制是2

    所以我的第一个查询看起来像->db.record.find().sort({category:1,sub_category:1});->返回前两条记录。
    我的第二个查询是->db.record.find({category:{$gte:A},sub_category:{$gt:2}})。sort({category:1,sub_category:1})

    我期待着记录3和记录4的回归。但我得到了记录3和记录6

    我明白我的质疑方式是不对的。我找不到另一个解决办法。请帮我解决这个问题


    另外,我没有使用跳过和限制技术,因为我遵循了。

    在Mongo中查询时,如果索引可以满足查询,则Mongo将遍历索引树(B-树),并且不会执行集合扫描

    因此,预期的文档顺序基本上只是一个“感知的顺序”。文档的“索引顺序”不同,在很大程度上取决于索引的字段、文档插入顺序等

    那你能做什么呢?您可以通过使用
    排序
    ,强制您的感知顺序:

    db.record.find({category : {$gte: A}, sub_category: {$gt : 2}}).sort({category: 1, sub_category: 1});
    

    我听从了汤姆·斯拉巴特和阿德南·艾哈迈德·安萨里的建议,解决方案奏效了

    我使用了这个查询:

    db.record.find({ $or: [ { category : 'A' , sub_category: {$gt : 2}}, { category : {$gt: 'A'} } ] })
    

    在第二个查询中,传递查询的where子句,以便数据正确返回3和6,因为第4和第5记录子类别值不大于2。对于分页,您需要使用skip和limit函数,就像第二页一样,您的查询将是db.record.find().skip(2).limit(2)@AdnanAhmedAnsari Hi Adnan。谢谢你的回复。实际上,我们不应该使用skip和limit函数进行分页。请查看此链接,然后您应该将查询更改为db.record.find({$or:[{category:'a',sub_category:{$gt:2},{category:{$gt:'a'}]})Hi Tom。谢谢你的回复。实际上,我也在使用排序功能。我忘了在问题中加上它。很抱歉,您在这里使用的是
    sub_category:{$gt:2}
    ,因此文档4和文档5会因为这种情况而被抛出。您应该使用
    {$or:[{$and:[{category:A},{sub_category:{$gt:2}]},{category:{$gt:A},]}
    query以遵循您的规则。是的。我遵循了这个技巧,它成功了。谢谢你抽出时间,汤姆:)