我相信这是 MongoDB 中查询引擎的工作方式。由于您的第一个标准的项目矩阵几乎可以满足所有要求,因此无需再做任何事情。
以下是该集合的索引:
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "test.colTest",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"fieldA" : 1
},
"ns" : "test.colTest",
"name" : "fieldA_1"
}
]
另外,您还没有正确完成研究。尝试将更多文档添加到集合中,您的问题将失败。
db.colTest.insert({fieldA:"1"})
运行查询:
db.colTest.find({"fieldA":"value1","fieldB":{"$exists":true}}).explain()
这是结果
{
"cursor" : "BtreeCursor fieldA_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"fieldA" : [
[
"value1",
"value1"
]
]
},
"server" : "local:27017"
}
此外,当您以不同方式查询时,explain() 的结果会再次发生变化。
db.colTest.find({"fieldB":{"$exists":true}, "fieldA":"value1"}).explain()
这是输出:
{
"cursor" : "BtreeCursor fieldA_1",
"isMultiKey" : false,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"fieldA" : [
[
"value1",
"value1"
]
]
},
"server" : "local:27017"
}
请通读文档,这里是参考:
http ://docs.mongodb.org/manual/reference/method/cursor.explain/
我认为确保使用索引的更可靠方法是查看“n”、“nscanned”和“nscannedObjects”。这些字段将为您提供更清晰的画面。
希望这可以帮助!