学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第91篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。
Mongodb的复合索引,给多字段查询带来了极大的好处,提高了多字段查询的性能。那么,对于查询后结果的排序,Mongodb复合索引是否能够有同样的优势呢?本问结合Mongodb的官方文档,来探讨复合索引的排序。
考虑下面的场景,一款移动游戏页面上展示了积分领先榜,包含了积分排序,活动每个积分的用户和用户积分更新时间。系统首先按照积分的倒序来进行排序。然后,对于相同积分的用户,名字按照字母表顺序进行排序。
为该集合添加一个复合索引,能够提高针对该查询和排序的性能。
构建leaderboard集合并插入数据
db.leaderboard.insertMany([
{score: 50, username: 'Alex Martin', date: ISODate('2022-03-01')},
{score: 55, username: 'Laura Garcia', date: ISODate('2022-03-02')},
{score: 60, username: 'Alex martin', date: ISODate('2022-03-03')},
{score: 60, username: 'Riya Patel', date: ISODate('2022-03-04')},
{score: 50, username: 'Laura Garcia', date: ISODate('2022-03-05')}
])
构建查询语句,按照积分倒序,用户名字母表顺序正序排列
db.leaderboard.find().sort({score: -1, username: 1})
为该集合添加索引,来提高查询排序效率
db.leaderboard.createIndex({
score: -1,
username: 1
})
该索引能够提高查询排序效率,索引指定的字段和排序,与查询条件相同。
同样,当为索引字段指定一个和查询条件相反的顺序时,也可以支持到该查询.
db.leaderboard.find().sort({ score: 1, username: 1})
但是,建立的复合索引,如果不符合查询条件指定的顺序或者反向排序时,该索引不能够支持到该查询和排序。比如使用下面两个查询语句,就无法使用该索引。
db.leaderboard.find().sort({score:1, username: -1})
除此之外,排序时指定的字段顺序与索引顺序不一致时,也不能使用索引进行排序。如下面的语句无法使用该索引。
db.leaderboard.find().sort({username: 1, score: -1})