首页 > 解决方案 > 为什么 Mongo 不能识别索引的非点版本?

问题描述

我在 Mongo 有一个这样的集合:

{
  'key': {
    'a': <value>,
    'b': <value>
  },
  'data': <stuff>
}

它有一个索引key

db.collection.createIndex( { 'key.a': 1, 'key.b': 1 } )

现在我希望这两个查询都使用索引:

db.collection.find( { 'key.a': 13, 'key.b': 37 } )
db.collection.find( { 'key': {'a': 13, 'b': 37 } } )

但是,正如.explain()语句所示,Mongo 将仅在第一个查询中使用索引 (IXSCAN) 而不是在第二个查询中(它使用 COLLSCAN)。

现在我很好奇,为什么 Mongo 不在查询的非虚线版本上使用索引?

标签: mongodbmongodb-indexes

解决方案


不知道为什么它没有正确使用索引(你使用的是什么版本的 MongoDB?),但是如果你提示它使用它们的索引。

> db.test.insert({"top" : { "key": { "a": 1, "b": 2}, "data" : "blahblah"}})
WriteResult({ "nInserted" : 1 })
> db.test.createIndex({ "key.a":1, "key.b" : 1 })
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.test.find( {"key" :{"a": 1, "b": 2}}).hint({"key.a":1, "key.b":1}).explain()
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "test.test",
                "indexFilterSet" : false,
                "parsedQuery" : {
                        "key" : {
                                "$eq" : {
                                        "a" : 1,
                                        "b" : 2
                                }
                        }
                },
                "queryHash" : "281CFA9E",
                "planCacheKey" : "281CFA9E",
                "winningPlan" : {
                        "stage" : "FETCH",
                        "filter" : {
                                "key" : {
                                        "$eq" : {
                                                "a" : 1,
                                                "b" : 2
                                        }
                                }
                        },
                        "inputStage" : {
                                "stage" : "IXSCAN",
                                "keyPattern" : {
                                        "key.a" : 1,
                                        "key.b" : 1
                                },
                                "indexName" : "key.a_1_key.b_1",
                                "isMultiKey" : false,
                                "multiKeyPaths" : {
                                        "key.a" : [ ],
                                        "key.b" : [ ]
                                },
                                "isUnique" : false,
                                "isSparse" : false,
                                "isPartial" : false,
                                "indexVersion" : 2,
                                "direction" : "forward",
                                "indexBounds" : {
                                        "key.a" : [
                                                "[MinKey, MaxKey]"
                                        ],
                                        "key.b" : [
                                                "[MinKey, MaxKey]"
                                        ]
                                }
                        }
                },
                "rejectedPlans" : [ ]
        },
        "serverInfo" : {
                "host" : "LAPTOP-O235KC41",
                "port" : 27017,
                "version" : "4.2.0",
                "gitVersion" : "a4b751dcf51dd249c5865812b390cfd1c0129c30"
        },
        "ok" : 1
}
>

推荐阅读