Все запросы будут использовать индекс для поиска, но только 2-й для сортировки, так как другие используют операторов, не являющихся условиями равенства.
Вы можете доказать это, запустив запросы с .explain()
См выход объяснить (с MongoDB 2.6.3) для этих 3-х запросов ниже, с ненужными поля опущены. "cursor"
показывает используемый индекс и "indexBounds"
показывает нижнюю и верхнюю границы индекса. "scanAndOrder" : false
указывает, что индекс также использовался для сортировки.
"indexBounds"
важен, потому что вы можете увидеть условие равенства - например, обратите внимание, что "$exists" : false
IS условие равенства (пустое значение) и потенциально использовать индекс, а "$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
}
]
]
},
}