关于node.js:按复合索引排序的集合上的分页?

 2022-02-13 

Paging on collection sorted by compound index?

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

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

例如:

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

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


首先,正如 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/


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

1
{votes: -1, _id: -1}

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