MongoDB文档
https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-在多个字段上:
对于使用复合索引进行排序的查询,cursor.sort((文档中所有键的指定排序方向必须与索引键模式匹配或与索引键的相反模式匹配。例如,索引键模式{a:1,b:-1}可以支持对{a:1,b:-1}和{a:-1,b:1}进行排序,但不能对{a:-1,b:-1}或{a∶1,b:1}执行排序。
https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-和索引的非前缀子集:
索引可以支持对索引键模式的非前缀子集进行排序操作。为此,查询必须在排序键之前的所有前缀键上包含相等条件。
问题
好的,给定一个索引{a: 1, b: 1, c: 1, d: 1}
,第一句话说我可以对{a: 1, b: 1, c: 1, d: 1}
及其逆{a: -1, b: -1, c: -1, d: -1}
进行排序。令人惊叹的第二句话说我可以使用索引进行带有索引前缀的查询,并按索引"进行排序;后缀";(如果我能铸造这个术语的话(,例如db.Foo.find({a: 52, b: {$lt: 5}, c: {$gte: 12}}).sort({d: 1})
。也很棒。
那么我的问题是,db.Foo.find({a: 52, b: {$lt: 5}, c: {$gte: 12}}).sort({d: -1})
(注意d
上的降序(会与索引{a: 1, b: 1, c: 1, d: 1}
匹配吗?它会在幕后反转索引并使用{a: -1, b: -1, c: -1, d: -1}
吗?据我所知,mongo的文档并没有涵盖这个案例。
阶段为;索引扫描可以过滤文档,然后在内存中进行排序。因此,答案是,在您的场景中,它没有利用索引进行排序。
但如果你有一个像这样的索引
{a: 1, d: 1, b: 1, c: 1}
即相等,然后排序,然后范围。无论您的查询是哪种方式,无论您在d
上的排序是哪种方向,它都将利用索引。
在幕后,这些都是B+树!