0

MongoDB 文档

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}。

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

索引可以支持对索引键模式的非前缀子集的排序操作。为此,查询必须在排序键之前的所有前缀键上包含相等条件。

问题

好的,所以给定一个 index {a: 1, b: 1, c: 1, d: 1},第一句话说我可以做 sorts{a: 1, b: 1, c: 1, d: 1}和它的 inverse {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 的文档没有涵盖这种情况。

4

1 回答 1

1

阶段是; 索引扫描以过滤文档,然后在内存中排序。所以答案是,它没有利用索引在您的场景中进行排序。

但是如果你有一个像这样的索引:

{a: 1, d: 1, b: 1, c: 1}

这是平等,然后是排序,然后是范围。无论您的查询方式和排序方向如何,它都会利用索引d

在幕后,这些是 B+ 树!

于 2020-07-16T08:32:40.320 回答