所有查詢將使用索引進行檢索,但只有第二個用於排序,就像其他用戶一樣不是平等條件的運營商。
可以通過運行與.explain查詢()
參見(從MongoDB的2.6.3)對於下面這些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
}
]
]
},
}