2015-10-09 38 views
0

我的數據庫中有以下對象結構。Mongo化合物陣列索引未被使用

{ 
    "_id": 1234, 
    "dateTime": ISODate("2015-09-28T02:15:00Z"), 
    "tags":[{ 
    "_id": 5678, 
    "name":{ 
     "short": "GOT", 
     "long" : "Game of Thrones" 
    } 
    },{ 
    "_id": 9101, 
    "name":{ 
     "short": "Dragons", 
     "long" : "Huge Dragons" 
    } 
    }] 
} 

我試圖使用查詢:

db.collection.find({ 日期時間:{$ GTE:新的日期(14433.98億),$ LT:新的Date(1443484740000)}, 「tags._id」: 「d8408d19-48e4-36a0-aa23-55cd8c8415f6」}})

我創建的索引:

{dateTime:1,tags._id:1}

然而,當使用explain()運行查詢時,它從不使用此索引。

我已經嘗試翻轉索引的另一種方式,並重新命令我的查詢,但這並沒有幫助。

我的數據庫中有大約500,000個文檔。

希望有人可以提供幫助。

+0

你可以在查詢中加入'.explain(true)'的輸出嗎?另外,你使用的是什麼特定版本的MongoDB? – Stennie

回答

0

我就是這樣的查詢

> db.comp.find({dateTime:{"$gte":new Date(12345),"$lte":new Date(999999999)},"ta 
gs._id":5678}).explain() 

,這裏是輸出

{ 
     "queryPlanner" : { 
       "plannerVersion" : 1, 
       "namespace" : "test.comp", 
       "indexFilterSet" : false, 
       "parsedQuery" : { 
         "$and" : [ 
           { 
             "tags._id" : { 
               "$eq" : 5678 
             } 
           }, 
           { 
             "dateTime" : { 
               "$lte" : ISODate("1970-01-12T13: 
46:39.999Z") 
             } 
           }, 
           { 
             "dateTime" : { 
               "$gte" : ISODate("1970-01-01T00: 
00:12.345Z") 
             } 
           } 
         ] 
       }, 
       "winningPlan" : { 
         "stage" : "KEEP_MUTATIONS", 
         "inputStage" : { 
           "stage" : "FETCH", 
           "filter" : { 
             "dateTime" : { 
               "$gte" : ISODate("1970-01-01T00: 
00:12.345Z") 
             } 
           }, 
           "inputStage" : { 
             "stage" : "IXSCAN", 
             "keyPattern" : { 
               "dateTime" : 1, 
               "tags._id" : 1 
             }, 
             "indexName" : "dateTime_1_tags._id_1", 
             "isMultiKey" : true, 
             "direction" : "forward", 
             "indexBounds" : { 
               "dateTime" : [ 
                 "(true, new Date(9999999 
99)]" 
               ], 
               "tags._id" : [ 
                 "[5678.0, 5678.0]" 
               ] 
             } 
           } 

如果你看到被用來"indexName" : "dateTime_1_tags._id_1"指數。

希望它能幫到

+0

它不會爲我選擇正確的查詢,我會得到dateTime的單個索引邊界。如果我暗示使用正確的索引性能是非常糟糕的,70秒返回 – robinsio

+0

我只是觸發相同的查詢db.comp.find({dateTime:{「$ gte」:new Date(1443398000000),「$ lt」 :new Date(1443484740000)},「tags._id」:5678})。explain()你在Question中提到並得到相同的結果。你在這個查詢中找到任何空隙嗎? –

+0

沒有你的查詢看起來很好,你運行這個數據集有多大,試着在dateTime字段中創建500,000個帶有隨機時間戳的文檔,我自己也有一個dateTime索引本身,這是它選擇的一個 – robinsio