【问题标题】:MongoDB Pagination with two values具有两个值的 MongoDB 分页
【发布时间】:2020-09-19 19:44:42
【问题描述】:

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

  1. {类别:A,子类别:1}
  2. {类别:A,子类别:2}
  3. {类别:A,子类别:3}
  4. {类别:B,子类别:1}
  5. {类别:B,子类别:2}
  6. {类别:B,子类别:3}
  7. {类别:C,子类别:1}
  8. {类别:C,子类别:2}
  9. {类别: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。

我明白我的查询方式不对。我找不到其他解决方案。请帮我解决这个问题。

附:我没有使用跳过和限制技术,因为我关注的是bucket pattern

【问题讨论】:

  • 在您的第二个查询中,您正在传递查询的 where 子句,因此数据正确返回 3 和 6,因为第 4 和第 5 条记录子类别值不大于 2。对于分页,您需要使用跳过和限制函数
  • 如第二页,您的查询将是 db.record.find().skip(2).limit(2)
  • @AdnanAhmedAnsari 嗨,阿德南。感谢您的答复。实际上,我们不应该使用跳过和限制功能进行分页。请查看此链接mongodb.com/blog/post/paging-with-the-bucket-pattern--part-1
  • 然后您应该将查询更改为 db.record.find({ $or: [ { category : 'A' , sub_category: {$gt : 2}}, { category : {$gt: 'A'} } ] })

标签: mongodb mongoose pagination


【解决方案1】:

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

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

那你能做什么?您可以使用sort 强制执行您的感知顺序:

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

【讨论】:

  • 嗨,汤姆。感谢您的回复。实际上,我也在使用排序功能。我忘了在问题中添加它。对此感到抱歉
  • 好吧,特别是在这里您使用sub_category: {$gt : 2},因此文档 4 和 5 由于这种情况而被丢弃。
  • 您应该使用{ $or: [ { $and: [ {category : A}, {sub_category: {$gt : 2}} ] }, {category : {$gt: A}}, ] } 查询来遵守您的规则。
  • 是的。我遵循这种技术,它奏效了。谢谢你的时间汤姆:)
  • @TomSlabbaert 你能帮我用超过 2 个字段进行分页吗stackoverflow.com/questions/71163444/…
【解决方案2】:

我听从了 Tom Slabbaert 和 Adnan Ahmed Ansari 的建议,解决方案奏效了。

我使用了这个查询:

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

【讨论】:

    猜你喜欢
    • 2019-09-27
    • 2022-06-15
    • 2015-10-02
    • 2021-06-14
    • 1970-01-01
    • 2019-10-25
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多