MongoDB甚至没有使用最简单的索引

时间:2013-02-12 02:26:21

标签: mongodb indexing mongodb-indexes

请看以下示例。在我看来,查询应该被索引{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
            ]
        ]
    }
}

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为真。