0

我有一个复合索引,看起来像:{ _id: -1, votes: -1 }在我的articles集合上,这样我就可以对文档进行排序,我可以通过这些文档将高票数的文章排在最前面,然后按降序排列最新的文章。

问题是我不确定如何按照我需要的排序顺序对该集合进行分页,因为我不确定游标修改查询的顺序。

例如:

Articles.find().sort('-_id -votes').skip(20).limit(30)

mongodb 将如何返回该查询的文档?它是根据在驱动程序上执行命令的顺序修改光标,还是对它们重新排序,以便在排序之前发生限制或除我认为它将如何执行之外的任何其他操作?

4

2 回答 2

4

首先,正如 Tyler 所指出的,如果您想首先按票数排序,您的索引应该以“votes: -1”开头。

其次,回答您的主要问题:您应用 sort()、skip() 和 limit() 的顺序无关紧要,只要在从游标中获取结果之前应用它们即可。使用这些的查询将始终先排序,然后跳过,然后返回限制指定的尽可能多的文档。

因此,查询“Articles.find().sort({votes: -1}).skip(20).limit(10)”将跳过 20 篇投票最高的文章,然后返回 10 篇。但是,“Articles.find().sort({votes: -1}).limit(10).skip(20)”会返回相同的结果!在您的具体示例中,它将跳过 20 个,然后返回 30 个文档。

有关更多信息,请查看文档:http ://docs.mongodb.org/manual/core/read-operations/

于 2013-09-16T19:05:30.380 回答
1

听起来您的索引和排序错误。我认为您想要的是按投票(降序)排序的文章,然后按 _id(也降序):

{votes: -1, _id: -1}

如果您以这种方式排序,您将获得按投票排序的文章(最先),按创建顺序。

于 2013-09-16T18:48:29.047 回答