9

我熟悉大型 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 条记录?

4

2 回答 2

6

@cubbuk 使用offset( skip) 展示了一个很好的示例,但您也可以塑造他为范围分页显示的查询:

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)

应该非常适合远程分页。

于 2013-01-10T08:30:21.817 回答
2

在这种情况下,您可以对多个字段进行排序,numTimesDoneSomething然后对字段进行排序id。由于 id_ 字段本身已经根据插入时间戳升序,因此您将能够对集合进行分页而无需迭代重复数据,除非在迭代期间插入新数据。

db.collection.find().sort({numTimesDoneSomething:-1, _id:1}).offset(index).limit(2)
于 2013-01-10T07:45:51.400 回答