我注意到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
}
那么......这两个领域之间可能有什么不同?
这是一个错误,还是我做错了什么?
我在Ubuntu 14.04.3 LTS的Vagrant框中运行MongoDB 3.0.6
答案 0 :(得分:0)
显然这是MongoDB核心的错误。或不当行为。 MongoDB不会对不同请求的虚线字段使用多键索引。
这是Mongo的回应:
独特优化使用特殊的索引访问阶段 将不同的索引键返回到其父级。在多键中 但是,不同的阶段必须检查null 或未定义的键。在null或undefined的情况下,它必须获取 完整文档,以消除字面空值与 由于缺少字段而为null。除非我们决定推迟 我们看到用户确实需要这个。
如果你真的想要这个功能,请在这里投票:SERVER-13298