请看以下示例。在我看来,查询应该被索引{a: 1}
覆盖,但是explain()
给了我indexOnly: false
。我做错了什么?
> db.foo.save({a: 1, b: 2});
> db.foo.save({a: 2, b: 3});
> db.foo.ensureIndex({a: 1});
> db.foo.find({a: 1}).explain();
{
"cursor" : "BtreeCursor a_1",
"nscanned" : 6,
"nscannedObjects" : 6,
"n" : 6,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"a" : [
[
1,
1
]
]
}
}
答案 0 :(得分:1)
索引仅表示覆盖查询(http://docs.mongodb.org/manual/applications/indexes/#indexes-covered-queries),其中查询及其排序和数据都可以在单个索引中找到。
您的查询存在问题:
db.foo.find({a: 1}).explain();
是否必须检索完整文档,这意味着它无法找到索引中的所有数据。相反,您可以使用:
db.foo.find({a: 1}, {_id:0,a:1}).explain();
这意味着您只投影a
字段,这使整个查询适合索引,因此indexOnly
为真。