mongoDB: 索引前缀查询时,倒排非前缀索引子集是否匹配整个索引?

mongoDB: does sorting by an inverted non-prefix index subset match the entire index when querying with index prefix?

MongoDB 文档

https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-on-multiple-fields:

For a query to use a compound index for a sort, the specified sort direction for all keys in the cursor.sort() document must match the index key pattern or match the inverse of the index key pattern. For example, an index key pattern { a: 1, b: -1 } can support a sort on { a: 1, b: -1 } and { a: -1, b: 1 } but not on { a: -1, b: -1 } or {a: 1, b: 1}.

https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-and-non-prefix-subset-of-an-index:

An index can support sort operations on a non-prefix subset of the index key pattern. To do so, the query must include equality conditions on all the prefix keys that precede the sort keys.

问题

好的,所以给定一个索引 {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+ 树!