我最近在尝试使用非唯一字段(例如“ FirstName”)进行分页请求时遇到相同的问题。此查询的思想是能够在不使用unique的字段上实现分页,而无需使用skip()
这里的主要问题是能够查询不是唯一的“ FirstName”字段,因为会发生以下情况:
- $ gt:{“ FirstName”:“ Carlos”}->这将跳过名字为“ Carlos”的所有记录
- $ gte:{“ FirstName”:“ Carlos”}->将始终返回同一组数据
因此,我想出的解决方案是通过将目标搜索字段与辅助字段组合在一起,使查询的$ match部分变得唯一,从而使其成为唯一搜索。
升序:
db.customers.aggregate([
{$match: { $or: [ {$and: [{'FirstName': 'Carlos'}, {'_id': {$gt: ObjectId("some-object-id")}}]}, {'FirstName': {$gt: 'Carlos'}}]}},
{$sort: {'FirstName': 1, '_id': 1}},
{$limit: 10}
])
降序排列:
db.customers.aggregate([
{$match: { $or: [ {$and: [{'FirstName': 'Carlos'}, {'_id': {$gt: ObjectId("some-object-id")}}]}, {'FirstName': {$lt: 'Carlos'}}]}},
{$sort: {'FirstName': -1, '_id': 1}},
{$limit: 10}
])
此查询的$ match部分基本上表现为if语句:如果firstName为“ Carlos”,则它也必须大于此id,如果firstName不等于“ Carlos”,则它必须大于“ Carlos”
唯一的问题是您无法导航到特定的页码(可以通过一些代码操作来完成),但是它解决了我对非唯一字段进行分页的问题,而不必使用跳过这会占用大量内存和处理时间到达要查询的任何数据集的结尾时的强大功能。