MongoDB -基于非唯一字段的分页

ijxebb2r  于 2023-11-17  发布在  Go
关注(0)|答案(3)|浏览(191)

我熟悉range based pagination在大型MongoDB集合上的最佳实践,但我正在努力弄清楚如何对排序值位于非唯一字段上的集合进行分页。
例如,我有一个很大的用户集合,其中有一个字段表示他们做了某件事的次数,这个字段肯定是非唯一的,并且可能有大量具有相同值的文档。
我想返回结果排序的'numTimesDoneSomething'字段。
下面是一个示例数据集:

{_id: ObjectId("50c480d81ff137e805000003"), numTimesDoneSomething: 12}
{_id: ObjectId("50c480d81ff137e805000005"), numTimesDoneSomething: 9}
{_id: ObjectId("50c480d81ff137e805000006"), numTimesDoneSomething: 7}
{_id: ObjectId("50c480d81ff137e805000007"), numTimesDoneSomething: 1}
{_id: ObjectId("50c480d81ff137e805000002"), numTimesDoneSomething: 15}
{_id: ObjectId("50c480d81ff137e805000008"), numTimesDoneSomething: 1}
{_id: ObjectId("50c480d81ff137e805000009"), numTimesDoneSomething: 1}
{_id: ObjectId("50c480d81ff137e805000004"), numTimesDoneSomething: 12}
{_id: ObjectId("50c480d81ff137e805000010"), numTimesDoneSomething: 1}
{_id: ObjectId("50c480d81ff137e805000011"), numTimesDoneSomething: 1}

字符串
我如何返回这个数据集排序的'numTimesDoneSomething'与2记录每页?

cvxl0en2

cvxl0en21#

@cubbuk展示了一个使用offsetskip)的很好的例子,但你也可以为范围分页塑造他所展示的查询:

db.collection.find().sort({numTimesDoneSomething:-1, _id:1})

字符串
由于_id在这里是唯一的,并且您正在附议它,因此您实际上可以按_id进行范围调整,并且即使在两个具有numTimesDoneSomething12的记录之间,结果也应该是一致的,无论它们应该在一个页面还是下一个页面上。
所以做一些简单的事情,

var q = db.collection.find({_id: {$gt: last_id}}).sort({numTimesDoneSomething:-1, _id:1}).limit(2)


应该工作相当不错的范围分页。

gj3fmq9x

gj3fmq9x2#

你可以对多个字段进行排序,在这种情况下,对numTimesDoneSomethingid字段进行排序。由于id_ field本身已经根据插入时间戳进行了升序排序,所以你将能够在集合中分页,而无需迭代重复的数据,除非在迭代过程中插入新数据。

db.collection.find().sort({numTimesDoneSomething:-1, _id:1}).offset(index).limit(2)

字符串

kuarbcqp

kuarbcqp3#

在对非唯一字段进行排序时,实现分页的正确方法是在查询中包含一个额外的唯一字段,但要以非常特定的方式:

var q = db.collection
       .sort({numTimesDoneSomething:1, _id:1})
       .find({$or: [
           {numTimesDoneSomething: lastNumTimesDoneSomething, _id: {$gt: lastId}},
           {numTimesDoneSomething: {$gt: lastNumTimesDoneSomething}}

       ])
       .limit(2)

字符串
返回到客户端的游标是[lastNumTimesDoneSomething, lastId]

相关问题