所有查询都将使用索引进行检索,但仅使用第二个进行排序,因为其他查询使用非相等条件的运算符。
您可以通过使用 .explain() 运行查询来证明这一点
请参阅下面这 3 个查询的解释输出(来自 MongoDB 2.6.3),省略了不必要的字段。 "cursor" 显示使用的索引,"indexBounds" 显示索引键的上下界。 "scanAndOrder" : false 表示该索引也用于排序。
"indexBounds" 很重要,因为您可以看到相等条件 - 例如,请注意 "$exists" : false 是一个相等条件(为 null)并且可能会使用索引,而 "$exists" : true 是一个范围。
另请参阅documentation on explain,它对于了解索引使用情况和诊断性能问题非常有用。
db.data.find( { b: 3, a: {$exists: true} } ).sort( { c: 1 } ).explain()
{
"cursor" : "BtreeCursor a_1_b_1_c_1",
"scanAndOrder" : true,
"indexBounds" : {
"a" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
],
"b" : [
[
3,
3
]
],
"c" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
},
}
,
db.data.find( { b: {$in: [3,4]}, a: 4 } ).sort( { c: 1 } ).explain()
{
"clauses" : [
{
"cursor" : "BtreeCursor a_1_b_1_c_1",
"scanAndOrder" : false,
"indexBounds" : {
"a" : [
[
4,
4
]
],
"b" : [
[
3,
3
]
],
"c" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
}
},
{
"cursor" : "BtreeCursor a_1_b_1_c_1",
"scanAndOrder" : false,
"indexBounds" : {
"a" : [
[
4,
4
]
],
"b" : [
[
4,
4
]
],
"c" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
}
}
],
}
,
db.data.find( { b: {$nin: [3,4]}, a: {$exists: false} } ).sort( { c: 1 } ).explain()
{
"cursor" : "BtreeCursor a_1_b_1_c_1",
"scanAndOrder" : true,
"indexBounds" : {
"a" : [
[
null,
null
]
],
"b" : [
[
{
"$minElement" : 1
},
3
],
[
3,
4
],
[
4,
{
"$maxElement" : 1
}
]
],
"c" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
},
}