2015-07-12 20 views

回答

1

所有查詢將使用索引進行檢索,但只有第二個用於排序,就像其他用戶一樣不是平等條件的運營商。

可以通過運行與.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 
       } 
      ] 
     ] 
    }, 
}