2015-10-17 41 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