https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-on-multiple-fields:
对于将复合索引用于排序的查询,cursor.sort()文档中所有键的指定排序方向必须与索引键模式匹配或与索引键模式相反。例如,索引键模式{a:1,b:-1}可以支持{a:1,b:-1}和{a:-1,b:1}上的排序,但不能支持{a:- 1,b:-1}或{a:1,b:1}。
索引可以支持对索引键模式的非前缀子集进行排序操作。为此,查询必须在排序键之前的所有前缀键上包含相等条件。
好的,因此给定索引{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的文档并未涵盖这种情况。
答案 0 :(得分:1)
阶段是;索引扫描可过滤文档,然后进行内存排序。因此,答案是,它没有利用索引对您的情况进行排序。
但是,如果您有类似这样的索引:
{a: 1, d: 1, b: 1, c: 1}
等于,然后依次排序和范围。无论查询的方式如何,排序的方向如何,d
都将利用索引。
在幕后,这些都是B +树!