【发布时间】:2020-09-19 19:44:42
【问题描述】:
假设我的 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。
我明白我的查询方式不对。我找不到其他解决方案。请帮我解决这个问题。
附:我没有使用跳过和限制技术,因为我关注的是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