我正在处理MongoDB
应用程序,但我遇到了覆盖查询的问题。在重新处理我的许多查询以便在分页时执行得更好时,我发现我之前覆盖的查询不再被索引覆盖。我试图尽可能地提取工作设置以隔离问题,但我仍然感到困惑。
首先,在一个新的(空)集合中,我插入了以下文档:
devdb> db.test.find()
{ "_id" : ObjectId("53157aa0dd2cab043ab92c14"), "metadata" : { "created_by" : "bcheng" } }
{ "_id" : ObjectId("53157aa6dd2cab043ab92c15"), "metadata" : { "created_by" : "albert" } }
{ "_id" : ObjectId("53157aaadd2cab043ab92c16"), "metadata" : { "created_by" : "zzzzzz" } }
{ "_id" : ObjectId("53157aaedd2cab043ab92c17"), "metadata" : { "created_by" : "thomas" } }
{ "_id" : ObjectId("53157ab9dd2cab043ab92c18"), "metadata" : { "created_by" : "bbbbbb" } }
然后,我为'metadata.created_by'字段创建了一个索引:
devdb> db.test.getIndices()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "devdb.test",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"metadata.created_by" : 1
},
"ns" : "devdb.test",
"name" : "metadata.created_by_1"
}
]
现在,我尝试按字段查找文档:
devdb> db.test.find({'metadata.created_by':'bcheng'},{'_id':0,'metadata.created_by':1}).sort({'metadata.created_by':1}).explain()
{
"cursor" : "BtreeCursor metadata.created_by_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"metadata.created_by" : [
[
"bcheng",
"bcheng"
]
]
},
"server" : "localhost:27017"
}
正在使用正确的索引,并且不会扫描任何无关的文档。无论.hint()
,limit()
或sort()
是否存在,indexOnly
仍为false
。
通过文档,我已经看到覆盖的索引将无法涵盖对数组元素的查询,但这不是这种情况(isMultiKey
显示false
)。
我错过了什么?这种行为还有其他原因(例如RAM,磁盘空间不足等)吗?如果是这样,我怎样才能在将来最好地诊断这些问题?