MongoDB - 无法获得覆盖查询

时间:2014-05-21 07:13:33

标签: mongodb indexing

所以我有一个空的数据库'tests'和一个名为'test'的集合。 首先,我确保我的索引设置正确。

db.test.ensureIndex({t:1})
db.test.getIndices()

[

    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "tests.test"
    },
    {
        "v" : 1,
        "key" : {
            "t" : 1
        },
        "name" : "t_1",
        "ns" : "tests.test"
    }
]

之后我插入了一些测试记录。

db.test.insert({t:1234})
db.test.insert({t:5678})

当我使用以下命令查询数据库并让Mongo解释结果时,我得到以下输出:

db.test.find({t:1234},{_id:0}).explain()

{

    "cursor" : "BtreeCursor t_1",
    "isMultiKey" : false,
    "n" : 1,
    "nscannedObjects" : 1,
    "nscanned" : 1,
    "nscannedObjectsAllPlans" : 1,
    "nscannedAllPlans" : 1,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "t" : [
            [
                1234,
                1234
            ]
        ]
    },
    "server" : "XXXXXX:27017",
    "filterSet" : false
}

有人可以向我解释为什么indexOnly是假的吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

要成为covered index query,您只需要检索索引中的那些字段:

> db.test.find({ t: 1234 },{ _id: 0, t: 1}).explain()
{
    "cursor" : "BtreeCursor t_1",
    "isMultiKey" : false,
    "n" : 1,
    "nscannedObjects" : 0,
    "nscanned" : 1,
    "nscannedObjectsAllPlans" : 0,
    "nscannedAllPlans" : 1,
    "scanAndOrder" : false,
    "indexOnly" : true,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
            "t" : [
                    [
                            1234,
                            1234
                    ]
            ]
    },
    "server" : "ubuntu:27017",
    "filterSet" : false
}

基本上这意味着索引用于检索数据,而无需返回实际文档并检索更多信息。这可以是您需要的多个字段(在合理范围内),但它们确实需要包含在索引中以及返回的唯一字段中。

答案 1 :(得分:0)

嗯原因尚未明确解释(实际上让我感到困惑)所以这是我的努力。

基本上,为了让MongoDB知道所述索引涵盖了查询,它必须知道你想要的字段。

如果你只是说你不想_id它怎么知道* - _id = t而不看?

此处*表示所有字段,就像在SQL中一样。

答案是不可以的。这就是为什么你需要提供完整的字段/选择/投影/它们用于定义的任何单词,以便MongoDB可以知道你的回报符合索引。