MongoDB索引不包含琐碎的查询

时间:2014-03-04 07:23:53

标签: mongodb indexing

我正在处理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,磁盘空间不足等)吗?如果是这样,我怎样才能在将来最好地诊断这些问题?

1 个答案:

答案 0 :(得分:1)

目前尚不支持。请参阅此Jira issue