2011-11-18 57 views
1

我有我的想法是蒙戈一個非常簡單的,簡單的查詢,並創建了索引:爲什麼我的索引只能在Mongo Query中使用?

{ "Ended" : 1, "EndDate" -1 } 

然而,當我在其上運行一個簡單的查詢,似乎認識到指數,但它的仍然掃描許多對象來檢索數據。這是我的查詢和解釋結果:

PRIMARY> db.listing.find({ "Ended" : { "$ne" : true }, "EndDate" : { "$lte" : ISODate("2011-11-18T00:47:40.638Z") } }).explain(); 
{ 
     "cursor" : "BtreeCursor Ended_1_EndDate_-1 multi", 
     "nscanned" : 24508585, 
     "nscannedObjects" : 24508583, 
     "n" : 24508583, 
     "millis" : 108323, 
     "nYields" : 0, 
     "nChunkSkips" : 0, 
     "isMultiKey" : false, 
     "indexOnly" : false, 
     "indexBounds" : { 
       "Ended" : [ 
         [ 
           { 
             "$minElement" : 1 
           }, 
           true 
         ], 
         [ 
           true, 
           { 
             "$maxElement" : 1 
           } 
         ] 
       ], 
       "EndDate" : [ 
         [ 
           ISODate("2011-11-18T00:47:40.638Z"), 
           true 
         ] 
       ] 
     } 
} 

任何明顯的想法我做錯了什麼?謝謝!

+0

如果你更換' 「結束」 發生了:{ 「$ NE」:真正}'和' 「結束」:FALSE'? (或不在你的模式中工作?) – Rich

回答

0

它不會僅使用索引,因爲您將通過該查詢檢索其他未編制索引的字段。

過去您的所有文檔都有EndDate嗎?當您在當前日期使用LTE時,它仍然會掃描當前日期之前的所有索引項目。它只掃描比掃描整個文檔更快的索引。

如果您查詢日期範圍,您會看到掃描對象的數量下降。

+0

大多數都在過去。一些在未來。 – Redth

2

n字段表示您的查詢是匹配的24.5M文件,其編號與nscannedObjects相同,這是正常行爲。如果您不需要全部24.5M匹配的文檔,則應該爲查詢添加其他條件。

我也看到你正在使用EndedDate: {$ne: true}。雖然這會起作用,但它會比EndedDate: false慢,所以如果該字段僅可能是truefalse,那麼最好使用後者。

+0

在這一點上我不能確定結束是否存在。也許我應該運行一次查詢將此字段添加到較舊的文檔 – Redth

+0

是的,您應該。 '$ ne'操作是邪惡的,因爲它隱含着一個'$ exists',它不能被索引。 – mnemosyn

+0

你是什麼意思'$ ne'意味着'$ exists'? – dcrosta

4

索引是不是很好用$ NE或$萬年queries.You將與

db.listing.find({ "Ended" : false , "EndDate" : { "$lte" : ISODate("2011-11-18T00:47:40.638Z") } }) 

的區別更好這裏雖然是你將不再獲取文件沒有「結束」字段中,或者「結束」字段爲空或其他類型。

Indexing Advice & FAQ - MongDOB

相關問題