我有一个按修改时间索引的问题集合。
{
"v" : 1,
"key" : {
"modified" : 1
},
"name" : "modified_1",
"ns" : "app23568387.questions",
"background" : true,
"safe" : null
}
但是,当我查询修改了字段的问题时,MongoDB并没有使用这个索引。
db.questions.find({modified: ISODate("2016-07-20T20:58:20.662Z")}).explain(true);
它返回
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 19315626,
"nscanned" : 19315626,
"nscannedObjectsAllPlans" : 19315626,
"nscannedAllPlans" : 19315626,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 384889,
"nChunkSkips" : 0,
"millis" : 43334,
"allPlans" : [
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 19315626,
"nscanned" : 19315626,
"scanAndOrder" : false,
"indexOnly" : false,
"nChunkSkips" : 0
}
],
"server" : "c387.candidate.37:10387",
"filterSet" : false,
"stats" : {
"type" : "COLLSCAN",
"works" : 19624020,
"yields" : 384889,
"unyields" : 384889,
"invalidates" : 3,
"advanced" : 0,
"needTime" : 19315627,
"needFetch" : 0,
"isEOF" : 1,
"docsTested" : 19315626,
"children" : []
}
}
当我使用
hint()
时,Mongo 抛出一个错误 bad hint
。我有另一个文件夹的集合,它具有完全相同的索引,并且查询使用该索引(对于 explain()
返回 "cursor" : "BtreeCursor modified_1"
)。问题和文件夹之间可能有什么区别?即使 getIndexes()
返回索引,索引是否可能“损坏”?如果是这样,我该怎么办才能修复它?
.explain("allPlansExecution")
运行该查询,然后更新你的问题并附上整个执行计划输出。重要部分是所选计划和拒绝计划部分,因为它们将展示我们MongoDB为什么没有选择modified_1
索引。此外,这句话:"当我使用hint()时,Mongo会抛出错误bad hint"表明你提供给hint()
方法的名称不存在索引中。 - glytchingtrue
。)modified_1
不在allPlans
中。这是否意味着即使在getIndexes
中返回,该索引也不存在? - Satoko