2015-07-12 6 views
1

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

Индекс

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

поддерживает этот запрос:

db.data.find({ b: 3, a: 4 }).sort({ c: 1 }) 

делает его также поддерживают

db.data.find({ b: 3, a: {$exists: true} }).sort({ c: 1 }) 
db.data.find({ b: {$in: [3,4]}, a: 4 }).sort({ c: 1 }) 
db.data.find({ b: {$nin: [3,4]}, a: {$exists: false} }).sort({ c: 1 }) 

ответ

1

Все запросы будут использовать индекс для поиска, но только 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 
       } 
      ] 
     ] 
    }, 
}