2016-09-04 38 views
1

您想對example集合執行覆蓋查詢。您有以下索引:爲什麼索引查詢不是覆蓋查詢?

{ name : 1, dob : 1 } 
{ _id : 1 } 
{ hair : 1, name : 1 } 

爲什麼下面的查詢不是covered query

db.example.find({ name : { $in : [ "Bart", "Homer" ] } }, {_id : 0, hair : 1, name : 1}) 

雖然這個人是:

db.example.find({ name : { $in : [ "Bart", "Homer" ] } }, {_id : 0, dob : 1, name : 1}) 

回答

1

據對index prefixes文檔,查詢

db.example.find({ name : { $in : [ "Bart", "Homer" ] } }); 

db.example.createIndex({ "name": 1, "dob": 1 }); 

但不覆蓋

db.example.createIndex({ "hair": 1, "name": 1 }); 

因爲{ "name": 1 }不是​​的preifx。

樣品

{ "_id": 1, "name": "Bart", "hair": "triangles", "dob": "1985-01-01" } 
{ "_id": 2, "name": "Homer", "hair": "two", "dob": "1960-01-01" } 

查詢1

> db.example.find(
>  { name: { $in: [ "Bart", "Homer" ] } }, 
>  { _id: 0, hair: 1, name: 1 } 
>).explain("executionStats"); 
... 
"executionStats": { 
    "totalKeysExamined": 2, 
    "totalDocsExamined": 2, 
    "executionStages": { 
     "stage": "PROJECTION", 
     "inputStage": { 
      "stage": "FETCH", 
      "inputStage": { 
       "stage": "IXSCAN", 
       "indexName": "name_1_dob_1", 
       ... 

正如你看到的,使用name_1_dob_1指數(因爲{ "name": 1 }{ "name": 1, "dob": 1 }前綴,都在索引檢查2個文件( "totalKeysExamined": 2),然後在集合中檢查了2個文檔("totalDocsExamined": 2),因爲name_1_dob_1索引沒有關於需要返回的hair的信息。

查詢2

> db.example.find(
>  { name: { $in: [ "Bart", "Homer" ] } }, 
>  { _id: 0, dob: 1, name: 1 } 
>).explain("executionStats"); 
... 
"executionStats": { 
    "totalKeysExamined": 2, 
    "totalDocsExamined": 0, 
    "executionStages": { 
     "stage": "PROJECTION", 
     "inputStage": { 
      "stage": "IXSCAN", 
      "indexName": "name_1_dob_1", 
      ... 

至於查詢1,指數name_1_dob_1使用和索引("totalKeysExamined": 2)檢查2個文件,但也有到集合("totalDocsExamined": 0)沒有呼叫,因爲索引name_1_dob_1包含dobname,並且不需要從集合中獲取更多內容。

+0

謝謝,快樂:) – xameeramir

相關問題