我熟悉大型MongoDB集合上range based pagination的最佳实践,但是我正在努力弄清楚如何对排序值在非唯一字段上的集合进行分页。
例如,我有大量用户,并且有一个字段表示他们已经完成某些事情的次数。此字段绝对不是唯一的,可能包含大量具有相同值的文档。
我想返回按'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条记录?
答案 0 :(得分:5)
@cubbuk使用offset
(skip
)显示了一个很好的示例,但您也可以模拟他为远程分页显示的查询:
db.collection.find().sort({numTimesDoneSomething:-1, _id:1})
由于此处的_id
将是唯一的,并且您正在对其进行借调,因此您实际上可以按_id
和结果进行调整,即使在numTimesDoneSomething
12
的两个记录之间也是如此},应该是一致的,无论是在一页还是下一页。
做一些像
这样简单的事情var q = db.collection.find({_id: {$gt: last_id}}).sort({numTimesDoneSomething:-1, _id:1}).limit(2)
对于远程分页应该非常有用。
答案 1 :(得分:2)
您可以对numTimesDoneSomething
和id
字段中的多个字段进行排序。由于id_字段本身已根据插入时间戳提升,因此除非在迭代期间插入新数据,否则您将能够在不迭代重复数据的情况下对集合进行分页。
db.collection.find().sort({numTimesDoneSomething:-1, _id:1}).offset(index).limit(2)