0

我有一个关于如何正确编写索引以避免求助于提示的问题。

示例“测试”集合架构

{
   _id: ObjectId(<whatever>),
   a: <whatever>,
   b: <whatever>,
   c: <whatever>,
   d: <whatever>,
   e: {
         f: <whatever>,
         g: <whatever>
      }
}

“测试”索引

db.test.ensureIndex( { "a": NumberInt(1), "c": NumberInt(1), "_id": NumberInt(1), "d": NumberInt(1) }, 
                     { name: "a_1_c_1__id_1_d_1", background: true } );

不带提示的查询和带提示的查询...

> db.test.find({},{d:1}).explain();
{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 752,
    "nscannedObjects" : 752,
    "nscanned" : 752,
    "nscannedObjectsAllPlans" : 752,
    "nscannedAllPlans" : 752,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 4,
    "nChunkSkips" : 0,
    "millis" : 5,
    "indexBounds" : {

    },
    "server" : <whatever>
}

> db.test.find({},{d:1}).hint("a_1_c_1__id_1_d_1").explain();
{
    "cursor" : "BtreeCursor a_1_c_1__id_1_d_1",
    "isMultiKey" : false,
    "n" : 752,
    "nscannedObjects" : 752,
    "nscanned" : 752,
    "nscannedObjectsAllPlans" : 752,
    "nscannedAllPlans" : 752,
    "scanAndOrder" : false,
    "indexOnly" : true,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "a" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ],
        "c" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ],
        "_id" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ],
        "d" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    },
    "server" : <whatever>
}

我(显然)希望查询使用覆盖的索引,但我不知道如何在不使用提示的情况下到达那里。可能吗?我更喜欢操纵索引而不是更改查询,但如果需要,更改查询是一种选择。

4

1 回答 1

0

原来这是一个已知问题。为帖子道歉。

https://jira.mongodb.org/browse/SERVER-2109

于 2013-09-13T21:51:14.907 回答