对按照复合索引排序的集合进行分页?

时间:2013-09-16 17:08:40

标签: node.js mongodb mongoose

我的{ _id: -1, votes: -1 }集合上有一个看起来像articles的复合索引,这样我就可以对文件进行排序,然后我可以按照降序排列高评论文章,然后再刊登最新文章

问题在于我不知道如何使用我需要的排序顺序来分页这个集合,因为我不确定光标修改查询的顺序。

例如:

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

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

2 个答案:

答案 0 :(得分:4)

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

其次,回答你的主要问题:你应用sort(),skip()和limit()的顺序并不重要,只要你在从光标获取结果之前应用它们。使用这些的查询将始终先排序,然后跳过,然后返回由limit指定的多个文档。

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

有关详细信息,请查看文档:{​​{3}}

答案 1 :(得分:1)

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

{votes: -1, _id: -1}

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