2015-10-17 43 views
0

我注意到,當在字段上查詢不同的值時,MongoDB不會使用索引。我會在一些領域使用它,但不會在其他領域使用它。MongoDB在不同的領域不使用索引

這裏的例子:

db.product.createIndex({"_indexed.preventieve_mondzorg-max_bedrag_p_jr": 1}); 
db.runCommand({distinct: "product", key:"_indexed.preventieve_mondzorg-max_bedrag_p_jr"}); 

這個查詢將不使用是建立在這一領域,並會去全面收集掃描索引。這就是它產生:

{ 
    "createdCollectionAutomatically" : false, 
    "numIndexesBefore" : 50, 
    "numIndexesAfter" : 50, 
    "note" : "all indexes already exist", 
    "ok" : 1 
} 
{ 
    "values" : [ 
     "€ 250,- | 75%", 
     "Geen dekking", 
     "...", 
    ], 
    "stats" : { 
     "n" : 33660, 
     "nscanned" : 0, 
     "nscannedObjects" : 33660, 
     "timems" : 12531, 
     "planSummary" : "COLLSCAN" 
    }, 
    "ok" : 1 
} 

在另一方面

db.product.createIndex({"free_choice.value": 1}); 
db.runCommand({distinct: "product", key:"free_choice.value"}); 

將索引:

{ 
    "createdCollectionAutomatically" : false, 
    "numIndexesBefore" : 50, 
    "numIndexesAfter" : 50, 
    "note" : "all indexes already exist", 
    "ok" : 1 
} 
{ 
    "values" : [ 
     "gedeeltelijk", 
     "geen", 
     "ja" 
    ], 
    "stats" : { 
     "n" : 4, 
     "nscanned" : 4, 
     "nscannedObjects" : 4, 
     "timems" : 2, 
     "planSummary" : "DISTINCT { free_choice.value: 1.0 }" 
    }, 
    "ok" : 1 
} 

所以......這可能是這兩個領域之間的區別?

這是一個錯誤,或者我做錯了什麼?

我正在運行的MongoDB 3.0.6在使用Ubuntu 14.04.3 LTS

回答

0

一個流浪盒顯然,這是MongoDB的核心的錯誤。或者是不正當的行爲。對於不同的請求,MongoDB不會使用虛擬域的多鍵索引。

這裏是蒙戈的迴應:

的不同優化使用該 返回不同的索引鍵其父階段特殊索引訪問的階段。然而,在多點密鑰 虛線的情況下,不同的階段將不得不檢查空值 或未定義的密鑰。在爲空或未定義的情況下,它必須獲取完整文檔以便通過缺失字段消除文字空值與空值之間的歧義。我們決定延期,除非 我們看到用戶真的需要這個。

如果你真的想要這個功能,請投票在這裏:SERVER-13298